题解 | #句子逆序#
句子逆序
https://www.nowcoder.com/practice/48b3cb4e3c694d9da5526e6255bb73c3
复杂代码版解题思路
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
I | a | m | a | b | o | y |
利用for循环逆序遍历,遇到空格‘ ’就输出空格右侧的单词
以I am a boy举例
第一个for循环逆序遍历
y→o→b→空格
遇到空格以后进入if
此时flag为4,S_num为9,num为9,i在6的位置
将j置于6的位置,使用第二层for循环输出
利用if跳过空格,然后输出7-S_num的单词
输出完后将S_num和num改为总长减flag的长度也就是5,flag为0
最后输出空格
第一个for循环继续逆序
a→空格
遇到空格以后进入if
此时flag为2,S_num和num是5,i在1的位置
将j置于4的位置,使用第二层for循环输出
利用if跳过4位置的空格,然后输出5-S_num位置的单词
输出完后将S_num和num改为总长减flag的长度也就是3,flag为0
最后输出空格
第一个for循环继续逆序
n→a→空格
遇到空格以后进入if
此时flag为3,S_num和num是3,i在1的位置
将j置于1的位置,使用第二层for循环输出
利用if跳过1位置的空格,然后输出2-S_num位置的单词
输出完后将S_num和num改为总长减flag的长度也就是1,flag为0
最后输出空格
第一层for循环结束,i为-1,此时第一个单词还没有输出
最后使用一个for循环输出第一个单词到空格结束就完成了
#include <stdio.h> int main() { int flag=0,i=0,num=0,j=0,S_num=0; char arry[1000]={'\0'}; while(scanf("%c",&arry[i])!=EOF) { if (arry[i]=='\n') { break; } if(arry[i]==' ')//判断字符串有没有空格,如果没有空格就不用逆序输出 { flag=1; } i++; } num=i-1; S_num=num; if(flag!=1)//没有空格直接正序输出 { for(i=0;i<=num;i++) { printf("%c",arry[i]); } } else { flag=0; for(i=i-1;i>=0;i--)//逆序 { if(arry[i]==' ') { for(j=num-flag+1;j<=S_num;j++)//S_num记录的是字符串的长度 { if(arry[j]==' ')//将空格跳过不输出 { } else { printf("%c",arry[j]); } } num=num-flag;//字符串长度减已经打印的字符的长度 S_num=num; flag=0; printf(" ");//打印空格 } flag++;//用于记录移动到空格所走的步数 } /*打印第一个空格前的单词*/ if(i==-1)//因为for循环出来以后i=-1 { for(i=0;arry[i]!=' ';i++) { printf("%c",arry[i]); } } } return 0; }