问题描述
输入一段英文,不含标点,将这一段英文以单词为单位倒序输出
输入格式
一段英文(段内不含换行),以换行符结尾。
输出格式
一段英文(段内不含换行),以换行符结尾。
样例输入
aab TTR bbc loV DDE Znr CCD
样例输出
CCD Znr DDE loV bbc TTR aab
- 基本思路
- 这道题目确实很简单啊,单纯的暴力解题就够了,只需要注意就是空格和最后的回车坐标位置之间的区别
#include#include #include using namespace std; int main() { string str,output; getline(cin, str); int length = str.length(); int n = 0, m = 0; for (int i = 0; i < length; i++) { if (str[i] == ' ') { m = i - 1; for (int j = m; j >= n; j--) output = str[j] + output; n = m + 2; output = ' ' + output; } else if (i == length - 1) { m = i; for (int j = m; j >= n; j--) output = str[j] + output; } } cout << output << endl; return 0; }
其实这里可以看出这个代码还是有很多地方需要改进的,需要使用的内存和时间还是很多的
- 进一步提升的话,之前的思路是按照顺序的0-length的顺序进行,就需要给最后的输出提供一个变量来储存,但是假如是由length-0这个倒着的顺序来进行计算的,那就没有必要储存这个倒装后的值了,直接进行输出就更加方便
#include#include #include using namespace std; int main() { string str; getline(cin, str); int length = str.length(), temp = length - 1; for (int i = length - 1; i >= 0; i--) { if (i == 0 || str[i] == ' ') { if (i == 0) i = -1; for (int j = i + 1; j <= temp; j++) cout << str[j]; cout << " "; temp = i - 1; } } return 0; }
可以和上面的对比看出来差距了,一个只是需要15ms,之前的需要765ms,差距还是很大
- 其实到之前那一段代码应该已经就算完成目标了,确实没有什么可以挖掘的内容了,但是后来是看了看substr,感觉代码可以更加短一点(虽然应该就是短了2行,本人水平不行,这样应该算是极限了),至少这个方法是省去了上面那段代码的输出部分,前一个输出部分就麻烦用了for循环,但是string里面已经给你设置好了substr截取部分字符串,那就更加方便了
#include#include #include using namespace std; int main() { string str; getline(cin, str); int length = str.length(), l, temp = length - 1; for (int i = length; i >= 0; i--) { if (str[i] == ' ' || i == 0) { if (i == 0) i = -1; l = temp - i; cout << str.substr(i + 1, l) << " "; temp = i - 1; } } return 0; }
虽然时间,内存一样,但是怎么说呢人比较懒,希望越简单越好



