PAT乙级-1009


PAT乙级-1009


题目分析

 涉及到字符串的操作,使用C++的string型变量可以很方便的解决。本题应用与PAT乙级1008题相同的算法,通过三次局部和整体的逆序转置就可以将整个字符串中的单词进行倒序重组。

 本题的一个难点在于字符串中每个单词的长度是未知的,因此在处理字符串的时候我们使用循环变量int i和用于记录的变量int pre来界定每一个单词在字符串中的位置,分界符自然就是空格符" "

 初始化ipre后,一遍循环逐个读入字符,读到空格符则将由prei确定的边界值所界定的单词进行逆置,直到字符串尾。再将局部逆置的字符串整个逆置就可以得到想要的输出。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "iostream"
#include "cstring"
using namespace std;

void reverse(string &s, int begin, int end){
char tmp;
while(begin < end){
tmp = s[end];
s[end] = s[begin];
s[begin] = tmp;
begin++, end--;
}
}

int main(){
string words;
getline(cin, words);
int pre = 0; // pre记录单词头下标
for(int i=pre; i<words.length();){
while((i<=words.length()) && (words[i++] != ' '));
reverse(words, pre, i-2); //i-2为单词尾下标
pre = i; // 更新pre
}
reverse(words, 0, words.length()-1);
cout << words;
return 0;
}

踩坑指南

 本题隐藏的坑有两点。其一是循环语句中下标的处理。在while循环语句中i<=words.length(),尽管i的取值范围是超出数组范围的,但是也不能将≤号换成<号,这与后续pre的赋值有关。其二是while循环条件中两个条件的摆放顺序。如果把判断空格符的条件放在前面,那么由于i++的后置加一处理,会导致第二个条件失去正确性,而按照程序中的顺序放置则没有问题。


转载请注明来源:©Tinshine