给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
解题思路:
设定两个指针,一个指向第一个字母,一个指向最后一个字母。
用while循环,从后往前遍历,当元素为空格时,用temp指针指向当前空格后的元素,并从此开始输出元素,知道遇到空格或者’\0’为止。(此时,temp指针在当前循环的作用已经完成)。让p指针找到前一个单词,在通过while循环,找到该单词的前面的空格,在输出该单词。以此类推。
代码1:
#include<iostream>
using namespace std;
int main()
{
char st[500001];
cin.getline(st, 500001);
char* p = st, *q = st;
while (*p != '\0')
{
p++;
} //指针指向\0
p--;
while (*p == ' ')
{
p--;
} //p指向最后一个字母
while (*q == ' ') //滤掉可能的前导空格
{
q++;
}
while (p >= q)
{
if (*p == ' ')
{
char *temp = p + 1;
while (*temp != '\0' && *temp != ' ')
{
cout << *temp;
temp++;
}
if (q != p)
{
cout << " ";
}
while (*p == ' ')
{
p--; //指到前一个单词末尾
}
}
else
{
p--; //找空格
}
}
while (*q != ' ')
{
cout << *q;
q++;
}
return 0;
}
代码2:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
string SayReverse(string s)
{
int k = 0;
for (int i = 0; i < s.size(); i++)
{
while (i < s.size() && s[i] == ' ') i++; //滤掉前导空格
if (i == s.size()) break;
int j = i;
while (j < s.size() && s[j] != ' ') j++; //找到第一个单词后的第一个空格
reverse(s.begin() + i, s.begin() + j);
if (k) s[k++] = ' ';
while (i < j)
{
s[k++] = s[i++];
}
}
s.erase(s.begin() + k, s.end());
reverse(s.begin(), s.end());
return s;
}
int main()
{
string s;
getline(cin, s);
cout << SayReverse(s);
return 0;
}
ps:博主能力有限,如果读者发现什么问题,欢迎私信或评论指出不足。欢迎读者询问问题,乐意尽我所能解答读者的问题。欢迎评论,欢迎交流。谢谢大家!