-
题目描述:
- 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;
}