单词倒排

【中级】单词倒排(C语言)

题目

对字符串中的所有单词进行倒排。

1、每个单词是以26个大写或小写英文字母构成;

2、非构成单词的字符均视为单词间隔符;

3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;

4、每个单词最长20个字母;题目出处

思路

首先把输入的字符串逆序,然后再去检测单词,将单词逆序。是句子逆序的进阶版,注意开头结尾连续特殊的情况(句子倒排没有)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include<stdio.h>
#include<ctype.h>
void flashback(char a[], int j, int p); //倒序函数
int main(void)
{
char a[10000];
int j, i, k, end;
char temp;
gets(a);
end = strlen(a)-1 ;
for (i = 0; i < end+1; i++) //先处理特殊符号
if (!isalpha(a[i])) //非字母将第一个符号替换为‘ ’
{
a[i] = ' ';
j = 0; //j用来记录连续特殊带符号的个数
if (i == 0) //如果是首字符 删除他
{ k = i;
for (; k <= end - 1; k++)

a[k] = a[k + 1];
a[k] = '\0';
}
else k = i+1; //k为特殊符号后的下一字符

while (!isalpha(a[i])&&i<(end+1))
{
i++;
j++;
}
j--;
if (i == (end+1) ) //如果特殊字符结尾,截断字符串
a[k - 1] = '\0';
else {
for (; k <= end - j; k++) //通过搬移数组去除掉连续的特殊字符

a[k] = a[k + j];
a[k] = '\0';
}

end=strlen(a)-1;
}

flashback(a, 0, end); //句子倒序

for (i = 0; i < end; i++)
if (!isspace(a[i]) && i < end) {
j = i++;
while (!isspace(a[i]) && i < end)
i++;
if (i < end) k = --i;
else k = end;
flashback(a, j, k);
}


puts(a);
}

void flashback(char a[], int j, int p)
{
int i;
char temp;
for (i = j; i < p; i++, p--)
{
temp = a[p];
a[p] = a[i];
a[i] = temp;
}
}

反思

重点在于如何处理特殊字符,一开始没有考虑到特殊字符首尾的情况频繁报错,后来通过增添条件解决了这种情况,成功达到目的。

但是跳过连续特殊字符的方法有些麻烦,数组反复赋值很笨。思考是否可以通过strcat函数达到目的,具体解决方法为判断连续特殊字符,加‘\0’结束字符串,然后找到下一个字母所在的地址,将这个字符串续接到截断的后面,有空我再试试。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 lsengard
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信