码迷,mamicode.com
首页 > 其他好文 > 详细

PAT 1009 说反话 (字符串)

时间:2020-04-06 15:35:28      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:lang   测试用例   输出   i++   解法   HERE   英文   还需要   输入   

题目>>

 

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

 

输入格式:

 

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

 

输出格式:

 

每个测试用例的输出占一行,输出倒序后的句子。

 

输入样例:

 

Hello World Here I Come

 

输出样例:

 

Come I Here World Hello

思路>>

想到用string解决问题,读入后从末尾开始处理,若遇到空格,即用substr返回空格后面的单词,但这样有个问题,第一个单词前面是没有空格的,所以还需要从前往后处理一遍,当遇到第一个空格就用substr输出空格前面的单词,也解决了末尾没有多余空格的问题。

1 for(int i=str.length()-1;i>=0;i--){
2             if(str[i]!= ){
3                 len++;
4             }
5             else if(str[i]== ){
6                 cout<<str.substr(i+1,len)<<" ";
7                 len=0;
8             }
9         }

处理完后有两个测试点是错的,因为代码默认了超过一个单词,所以要考虑一个单词的情况,直接在第二遍for循环(从前往后)的时候讨论一个单词的情况(即到最后都没有出现空格)即可。

1 for(int i=0;i<str.length();i++){
2             if(str[i]== ){
3                 cout<<str.substr(0,i);
4                 break; 
5             }
6             else if(i==str.length()-1) cout<<str;
7         }

完整代码>>

注意含有空格的string输入要用getline(cin,str);

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 int main(){
 4     string str;
 5     getline(cin,str) ;
 6     int len=0;
 7     for(int i=str.length()-1;i>=0;i--){
 8         if(str[i]!= ){
 9             len++;
10         }
11         else if(str[i]== ){
12             cout<<str.substr(i+1,len)<<" ";
13             len=0;
14         }
15     }
16     for(int i=0;i<str.length();i++){
17         if(str[i]== ){
18             cout<<str.substr(0,i);
19             break; 
20         }
21         else if(i==str.length()-1) cout<<str;
22         }
23 }

一开始的代码(用flag来标记是否是一个单词)

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 int main(){
 4     string str;
 5     getline(cin,str) ;
 6     int len=0;
 7     int flag=0;//判断是否是单个单词
 8     for(int i=0;i<str.length();i++){
 9         if(str[i]== ) flag=1; 
10     } 
11     
12     if(flag==0) cout<<str;
13     else{
14         for(int i=str.length()-1;i>=0;i--){
15             if(str[i]!= ){
16                 len++;
17             }
18             else if(str[i]== ){
19                 cout<<str.substr(i+1,len)<<" ";
20                 len=0;
21             }
22         }
23         for(int i=0;i<str.length();i++){
24             if(str[i]== ){
25                 cout<<str.substr(0,i);
26                 break; 
27             }
28         }
29     }
30 }

 解法二(EOF)>>

 

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 int main(){
 4     char str[81][81];
 5     int n=0;
 6     while(scanf("%s",str[n])!=EOF){
 7         n++;
 8     }
 9     for(int i=n-1;i>=0;i--){
10         printf("%s",str[i]);
11         if(i>0) printf(" ");
12     }
13 }

 

当scanf返回值不为-1的时候反复读取单词。

解法三(常规)>>

存入二维数组倒序输出。

 

 

 

PAT 1009 说反话 (字符串)

标签:lang   测试用例   输出   i++   解法   HERE   英文   还需要   输入   

原文地址:https://www.cnblogs.com/taiga/p/12641999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!