这个题之前的做法很呆板,详见http://blog.csdn.net/qq_27474589/article/details/75628444,现在又碰到了,下面给出更为简洁高效的几种做法。
题目链接https://www.patest.cn/contests/pat-b-practise/1009
1009. 说反话 (20)
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come输出样例:
Come I Here World Hello
方法一:
倒序遍历字符串,碰到空格将其后面输出,然后将此空格换成'\0',这样一直往前循环操作,因为碰到结束符就结束输出,所以正好每次输出一个单词。
此方法简洁高效,思想很巧妙,力荐!
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main(){
char s[100];
gets(s+1);
s[0]=' ';
for(int i=strlen(s)-1;i>=0;i--){
if(s[i]==' ') {cout<<s+i+1;s[i]='\0';}
else continue;
if(i==0) cout<<endl;
else cout<<' ';
}
return 0;
}
方法二:
直接利用scanf的格式化输入,不过在本地调试的话不方便,要是能用文件输入就看得到效果。正好oj是文件操作嘛,代码拷上去能通过。
#include<iostream>
using namespace std;
int main(){
char s[81][81];
int cnt=0;
while(cin>>s[cnt]){cnt++;}
for(int i=cnt-1;i>=0;i--){
if(i==cnt-1) cout<<s[i];
else cout<<' '<<s[i];
}
cout<<endl;
return 0;
}
Java操作。不得不说Java的各种函数真的是方便强大啊,直接将输入的字符串以空格分割。然后倒序输出。
//Java实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String array[] = s.split(" ");
int i=array.length-1;
for(;i>0;i--){
System.out.print(array[i]+" ");
}
System.out.println(array[i]);
}
}