版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/okiwilldoit/article/details/78732379
题目:给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello”
思路:
第一步:翻转句子中所有的字符。比如翻转“hello xiao mi”,变成“im oaix olleh”
第二步:再翻转每个单词的顺序,就变成了“mi xiao hello”
这种思路的关键在于翻转一段子字符串。
void ReverseWord(char* begin, char* end)
{
if(begin == NULL || end == NULL)
{
return;
}
char tmp;
while(begin < end)
{
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
翻转句子的函数为:
void ReverseSentence(char* sentence)
{
int size = (int)strlen(sentence);
ReverseWord(sentence, sentence+size-1);//最后一位是'\0',无需处理
int start = 0, i = 0;
while(i <= size)
{
if(sentence[i] == ' ' || sentence[i] == '\0')
{
int sub_size = i-start;
if(sub_size > 0)
{
ReverseWord(sentence + start, sentence + start + sub_size - 1);
start = i+1;
}
}
i++;
}
}
主函数:
int main()
{
while(true)
{
char str[1000];
char* sentence = gets(str);
ReverseSentence(sentence);
printf("%s\n", sentence);
}
return 0;
}
以上方法,直接就在原来的字符串上操作,无需额外空间。