题解 | #单词倒排#
单词倒排
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; }