题解 | #单词倒排#
单词倒排
https://www.nowcoder.com/practice/81544a4989df4109b33c2d65037c5836
//分享一个比较简单的思路,用代码量换难度
#include <stdio.h>
#include<string.h>
int main()
{
char arr[10001] = "";
gets(arr);
int sz = strlen(arr);
int i = 0, j = 0, left = 0, right = 0, flag = 0, tmp = 0;
//flag记录从后往前遍历时遇到的第一个字母,tmp记录从后往前遍历时遇到字母后的第一个空格
for (i = 0; i < sz; i++)
{
//如果不是字母,就置换成空格
if (!(((arr[i] >= 'A') && (arr[i] <= 'Z')) || ((arr[i] >= 'a') && (arr[i] <= 'z'))))
{
arr[i] = ' ';
}
}
for (i = sz - 1; i >= 0; i--)
{
//从后往前遍历,遇到第一个字母之后,记录当前位置,并且flag置为1防止right被改动
if ((((arr[i] >= 'A') && (arr[i] <= 'Z')) || ((arr[i] >= 'a') && (arr[i] <= 'z')))&&(flag==0))
{
right = i;
flag = 1;
}
//遇到第一个空格,并且flag=1说明后面已经有字母,同时tmp=0表示此空格是第一个空格
else if ((arr[i] == ' ') && (flag == 1)&&(tmp==0))
{
//单词左下标是该空格的下一个
left = i + 1;
tmp = 1;
//从左到右打印这个单词的每个字符
for (j = left; j <= right; j++)
{
printf("%c", arr[j]);
}
//打印完毕再输出一个空格
printf(" ");
//再将flag和tmp置为原始状态,准备下一轮循环,打印下一个单词
flag = 0;
tmp = 0;
continue;
}
//此处处理字符串首个单词,i=0,在字母前面没有空格,直接打印该单词,至此全部打印完毕
if ((i == 0) && (flag == 1))
{
for (j = 0; j <= right; j++)
{
printf("%c", arr[j]);
}
}
}
return 0;
}
查看4道真题和解析