首页 > 代码库 > 翻转句子中单词的顺序

翻转句子中单词的顺序

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。比如输入"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‘,翻转完该单词后就恢复翻转单词的后一个字符。




翻转句子中单词的顺序