-
题目描述:
- JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
-
输入:
-
每个测试案例为一行,表示一句英文句子。我们保证一个句子的单词数不会超过600,每个单词的长度也不会超过30。但是需要注意的是Fish是个不拘小节的人,有时候两个单词中间可能会有很多空格。为了方便起见,你可以认为一行的字符总数不会超过50000个,标点符号可以和普通字母一样处理。
-
输出:
- 对应每个测试案例,把翻转后的正确的句子单独输出一行。
样例输入:
student. a am I I'm a Freshman and I like JOBDU!样例输出:
I am a student. JOBDU! like I and Freshman a I'm
解法:首先将字符串整体翻转,然后再将字符串以空格为分界一一翻转。
#include <stdio.h> #include <string.h> #include <stdlib.h> void Reverse(char *s, int start , int end) { char *s1; int i,n ; s1 = (char*)malloc((end-start+1)*sizeof(char)); n = end-start; for(i=0;i<=n;i++) { s1[i]=s[end-i]; } for(i=0;i<=n;i++) { s[start+i]=s1[i]; } free(s1); } int main() { int i=0,n ,end ,start; char s1[50001]=" "; while(gets(s1)) { n=strlen(s1); Reverse(s1,0,n-1); i = 0 ; while(i<n) { if(s1[i]!=' ') { start = i ; while(s1[i]!=' ' && i <n) { i++; } i--; end = i ; Reverse(s1,start,end); } i++; } puts(s1); } return 1; } /************************************************************** Problem: 1361 User: tcals Language: C Result: Accepted Time:50 ms Memory:912 kb ****************************************************************/