今天这道题目呢,是我们之前在PAT乙级中遇到的“说反话”题目的进阶版本,当然,标题里也说得很清楚了,这道题就是“说反话-加强版”。
我们先来看看该题的具体要求:
1、给定一句英语,要求将句中所有单词的顺序颠倒打印输出。
2、该字符串长度不超过500000,字符串由若干空格和单词组成,其中单词是由英文单词(大小写有区分)组成的字符串,单词之间用若干个空格分开。
3、打印输出的结果,保证每个单词之间只有一个空格。
梳理逻辑编程题最最重要的就是逻辑,这道题与之前的“说反话”的差别就在于,一方面是对字符串的长度有了一定的要求,另一方面是遇到多个空格时,要把多个空格给省略,在结果打印方面只有一个空格。
1、输入一个字符串,且长度不超过500000,所以要用到字符数组来存储该字符串,且数组内存储的数字为500001,因为数组下标是从0开始的,用scanf函数来进行输入。
2、将输入的英语句子颠倒顺序后输出,那么就需要进行一次倒序遍历,此时倒序遍历最终的值是无法把数组下标为0的数给打印出来,所以我们需要把数组下标为0的数,也就是第一个英语单词给单独存储起来。
同时也是为了防止输入的是空格时,打印导致报错。
而至于如何把中间多余的空格给去掉,我们就需要用到一个计数法了。
以测试用例为例,遇到单词时,我们开始计数,然后遇到空格时,且计数大于0,也就是没有连续的空格时,那么就要跳过空格,打印下一个单词。
如果是整句字符串只有空格的情况下,那就要直接结束打印了。
代码实现//说反话-加强版
#include<stdio.h>
#include<string.h>
int main() {
char string[500001];//长度要不超过500000,数组下标从0开始
long i = 0;
int count = 0;//进行一个计数法来打印空格
scanf("%[^\n]",string);//输入字符串
for(i = strlen(string); i >= 0;i--){
if (string[i] == ' '&&count>0) {//遇到空格,也就是空出来的,但是没有连续的空格
printf("%s", &string[i 1]);
if(string[0]!=' '){//第一个字符串不为空
printf(" ");
}
string[i] = '\0';
count = 0;
}
else if (string[i] == ' '){//只有空格的状态
string[i] = '\0';
}
else if(string[i]!=' '&&string[i]!='\0'){//没有空格且没有结束
count ;
}
}
printf("%s", &string[0]);//打印最开始的字符串
}
结果测试
对于这道题目而言,其实还是有些难度的,我虽然考虑到了计数法,但在实际完成这道题目的时候,梳理这个计数法的逻辑花了不少时间,需要好好反思了。