翻转句子中单词的顺序

来源:互联网 发布:王大治与董洁 知乎 编辑:程序博客网 时间:2024/06/04 21:41
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。比如输入"I love you.",输出"you. love I"。

解题思路:
我们可以先翻转整个字符串,然后再翻转字符串中的每个单词。比如"I love you."翻转整个字符串后得到".uoy evol I",再翻转字符串中的每一个单词得到"you. love I"。当然也可以先翻转字符串中的每个单词,翻转整个字符串。注意多个空格连续时还是当成一个分隔符,比如"  I love you.  "翻转句子后变成"  you. love I  "。

算法实现:

void reverseSentence(char str[]){if(str==NULL||str[0]=='\0') return;//字符串为空或为空串时,直接返回reverseStr(str);int n=0;int start=0;char temp;while(str[n]!='\0'){while(str[n]==' ') //当多个' '连着时,还是将它们看成一个分割符{n++;}start=n;while(str[n]!=' '&&str[n]!='\0'){ n++;}temp=str[n];//保存翻转单词的后一个字符,在这里是' '字符或'\0'结束符str[n]='\0';reverseStr(str+start);str[n]=temp;//恢复翻转单词的后一个字符if(str[n]=='\0') break;//跳出循环n++;}}


reverseStr()方法我的一篇博文有它的具体实现:字符串翻转


PS:这里翻转单词时,可以通过在翻转字符串的基础上,另外再传递一个结束指针实现,很多人都是这样实现的。但是我前面已经写了一个翻转字符串的方法,不想再改这个方法,让它接受两个参数的传递,所以我用了一个辅助字符,当要翻转单词时,我保存翻转单词的后一个字符,然后令翻转单词的后一个字符为'\0',翻转完该单词后就恢复翻转单词的后一个字符。




1 0
原创粉丝点击