PAT 1009
题目:给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
代码
//在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,
//其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格
//输入样例 Hello World Here I Come
//输出样例 Come I Here World Hello
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string str;
vector<char> temp;
vector<vector<char>> ans;
vector<string> v;
getline(cin, str);
int cnt = 0;
for (auto i : str) {
cnt++; //用来计数
if ((i == ' ')||(cnt == str.length() + 1)) {
ans.push_back(temp); //将一个单词存入ans中
temp.clear(); //清空临时存储单词的vector
continue;
}
temp.push_back(i); //将单个字母存入vector
}
ans.push_back(temp);
reverse(ans.begin(), ans.end());
// 利用reverse对容器进行倒序
for (auto i : ans) {
for (auto j : i)
cout << j;
if (i == ans.back())//如果是ans中的最后一个元素,不用再输出空格
break;
else
cout << " ";
}
return 0;
}
思路
在学习了c++之后,我考虑用vector容器来解决问题
ans[0] | ans[1] | ans[2] | ans[3] | ans[4] | ans[n] |
---|---|---|---|---|---|
单词1 | 单词2 | 单词3 | 单词4 | 单词5 | 单词n |
这是一个
vector<vector<char>> ans
用来存放char型vector的vector,是容器的一个嵌套
for (auto i : ans)
在这个基于范围的for循环中,i
对应的就是单词i
遇到的困难
1、string类型的输入输出:直接使用cin/cout无法输入,经过查询使用了
getline(cin, str)
2、写代码时经常出现“无法重载”的错误,在使用vector类型时,有时类型不对应,无法调用功能
3、使用基于范围的for循环,需要另外添加条件来判断是否结束,在这个代码中我使用了cnt来和str.length()比较,要注意的是,在pat的gcc++的编译条件下,会有warning出现,因为cnt是有符号数,str.length()是无符号数
4、调用reverse函数时,在pat的编译环境下要加上
#include <algorithm>
5、同样在最后输出时,使用基于范围的for循环,要判断是否到最后一个元素,最后一个空格不能输出
if (i == ans.back())
使用判断条件,使用 下面这个错误
ans.end()
ans.beck()返回当前vector容器中末尾元素的引用
ans.end()返回一个当前vector容器中末尾元素的迭代器,要访问末尾元素,需要先将此迭代器减1
back()函数返回最后一个元素的地址,end()返回尾地址,尾地址不指向任何存储的元素,而是标志vector的结束。