九度oj 题目1525:子串逆序打印
题目1525:子串逆序打印
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:3124
解决:530
- 题目描述:
-
小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串的每个子串都打印反了,现在麻烦你帮小明将这些字符串中的子串修正过来,同时为了使卡片美观,压缩其中的连续空格为1个。
- 输入:
-
输入包含多个测试用例,每个测试用例的第一行是一个正整数 n,1=<n<=100000,代表卡片上字符串的长度。第二行输入长度为n的字符串(字符串仅包含小写字母和空格)。当n为0时,代表输入结束。
- 输出:
-
对应每个测试用例,请按照要求输出修正过的字符串。
- 样例输入:
-
3 abc 13 abc efg hij
- 样例输出:
-
cba cba gfe jih
分析:本题遇到了比较多的问题,读入一行后,我一开始是判断abc是个串之后直接将其逆序一个一个字母输出,然后
直接输出一个空格。。。试了很久案例未能全部ac,原因是:一开始没有看懂题目那句话:压缩其中的连续空格为1个。我自己编码的意思
是逆序输出一个子串后空一格,实际上不是这个意思,题意是说有多个空格则只输出一个空格,子串逆序输出,比如一开始连续三个
空格,则首先要输出一个空格。。就这个意思。
总结:题意要弄明白,需求很重要,否则很浪费时间。以下是代码:1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <string> 5 using namespace std; 6 int main(){ 7 int n, i, j, flag; 8 vector<string> v; 9 string s, str; 10 while(cin >> n){ 11 if(n == 0) 12 break; 13 v.clear(); 14 getchar(); 15 getline(cin, s); 16 for(i = 0; i < n;){ 17 flag = 0; 18 str = ""; 19 while(s[i] != ' ' && i < n){ 20 str += s[i]; 21 i++; 22 } 23 while(str == "" && s[i] == ' ' && i < n){ 24 flag = 1; 25 i++; 26 } 27 if(flag == 0) 28 v.push_back(str); 29 else{ 30 str += ' '; 31 v.push_back(str); 32 } 33 } 34 for(j = v[0].length() - 1; j >= 0; j--) 35 cout << v[0][j]; 36 for(i = 1; i < v.size(); i++){ 37 for(j = v[i].length() - 1; j >= 0; j--) 38 cout << v[i][j]; 39 } 40 cout << endl; 41 } 42 //system("pause"); 43 return 0; 44 }
越努力,越幸运