[pat乙]1009 说反话
原创
©著作权归作者所有:来自51CTO博客作者俺叫西西弗斯的原创作品,请联系作者获取转载授权,否则将追究法律责任
1009 说反话 (20 分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
思路
1.逆序输出
2.以空格分割单词
3.双下标确保输出单词
提示
1.多空格情况。
2.单个单词情况
3.string以空格为标志返回
4.string无法直接字符接收
5.注意具体长度
#include <iostream>
using namespace std;
#include <string>
int main() {
string str;
getline(cin, str);
int fn = 0, spcN = 0, pN = 0;
//同步i 目前的位置,空格,判断是否只有一个单词。
int index = str.length() - 1;
for (int i = str.length(); i > 0; i--)
{
fn = i;
//以空格为标志划分单词,不输出空格,手动输出空格。
//如果不是第一次碰见空格 就输出空格
if (str[i] == ' ') {
if (spcN)
cout << " ";
spcN++;
//标记现在上个空格到的位置
//输出非空格字符 防止多空格
for (int j = i + 1; j <= index; j++) {
if (str[j] != ' ')
{
cout << str[j];
pN++;
}
//到了上次的最后一位,开始新一轮同步位次
if (j == index) {
index = fn - 1;
}
}
}
}
//如果非单个单词 就输出空格
if (pN) cout << " ";
//最后一个单词逆序不会有空格 所以这里正序输出
//在第一个空格前break
for (int i = 0; i < str.length(); i++)
if (str[i] != ' ')
cout << str[i];
else break;
return 0;
}
其他有趣的写法 不是我写的
2.
列表 分割 反序 插入空格 输出
s=input().split()
s.reverse()
print(' '.join(i for i in s))
3.
1.以空格标识
2.更换为结束符 保证一次只输出一个词
3.首地址输出 直接输出完了 😂
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char a[80];
gets_s(a,80);
int i = 0;
for (i = strlen(a); i > 0; i--)
{
if (a[i] == ' ')
{
printf("%s ", &a[i + 1]); //输出空格后的单词
a[i] = '\0'; //使后续输出仍为一个单词
}
}
printf("%s", &a[i]); //输出原字符串的第一个单词
return 0;
}