- 题目描述:
- 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
【解析】
【代码】
/********************************* * 日期:2013-11-29 * 作者:SJF0115 * 题号: 题目1361:翻转单词顺序 * 来源:http://ac.jobdu.com/problem.php?pid=1361 * 结果:AC * 来源:剑指Offer * 总结: **********************************/ #include <stdio.h> #include <malloc.h> #include <string.h> char *words; //反转单词 void ReverseWord(char* words,int begin,int end){ int temp; if(words == NULL || begin > end || begin < 0){ return; } //反转 while(begin < end){ temp = words[begin]; words[begin] = words[end]; words[end] = temp; begin ++; end --; } } char* Reverse(char *words){ int i; if(words == NULL){ return NULL; } int len = strlen(words); //反转整个句子 ReverseWord(words,0,len-1); //逐个反转单词 int begin = 0,end = 0,isFirst = 0;//begin 单词第一个字母下标 end 单词最后一个字母下标isFirst 判断是不是单词后第一个空格 for(i = 0;i <= len;i++){ //空格 if(isFirst == 0 && words[i] == ' '){ begin = end = i+1; } //单词后第一个空格或者一个句子的结束 else if((isFirst == 1 && words[i] == ' ')|| words[i] == '\0'){ ReverseWord(words,begin,end); begin = end = i+1; isFirst = 0; } //单词 else{ end = i; isFirst = 1; } } return words; } int main() { int i,n; words = (char*)malloc(sizeof(char)*50001); while(gets(words)){ words = Reverse(words); for(i = 0;i < strlen(words);i++){ printf("%c",words[i]); } printf("\n"); }//while return 0; }
时间: 2025-01-19 13:32:03