题解 | #句子逆序#
句子逆序
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;
}

查看11道真题和解析
汤臣倍健公司氛围 420人发布