相关知识
- 字符串反转(HJ5)、句子逆序(HJ6),除此以外还有哪些类似的常见题型?解法有何区别?
反转句子中每个单词内部的字符顺序,但保持单词顺序不变。——在逐一把单词加入vector<string>之前先用reverse()翻转一次。每隔一段固定距离,反转一次。——按固定距离截取字符串,反转后再追加到新字符串里。句子逆序,反转单词顺序,但单词的分隔符既有空格又有逗号。——逗号统一换成空格。
istringstream的用法是什么?
在这道题中,iss以空格为分隔将字符串s中的单词逐一的输入到字符串word中,再把word添加到字符串向量words里。另一种用法是getline(iss, s, ','),这可以把iss中的字符以,分隔出去,常用于处理CSV文件。- 在C++常见的各种数据结构中,各自在自己内部追加元素的方法都是什么?
序列容器string:用push_back()追加字符,用append()追加字符串,用+=既可追加字符也可追加字符串。序列容器vector:用push_back()尾部追加,用emplace_back()尾部构造追加。序列容器deque:用push_back()尾部追加,用emplace_back()尾部构造追加。序列容器list:用push_back()尾部追加,用emplace_back()尾部构造追加。哈希容器unordered_set:也叫无序容器。无序,也就无所谓尾部,因此只有插入insert()和构造插入emplace()。哈希容器unordered_map:也叫无序容器。无序,也就无所谓尾部,因此只有插入insert()和构造插入emplace(),此外还可以通过访问键直接插入,类似vector。
emplace_back()与push_back()的区别是什么?
push_back():先在外部构造临时对象,然后再拷贝或移动到容器内,最后销毁临时对象。emplace_back():直接在容器的内存空间里创建对象,然后通过完美转发传递参数,没有临时对象,因而通常更加高效。
第一轮
最后一版(AC)
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s);
istringstream iss(s);
vector<string> words;
string word;
while (iss >> word) {
words.push_back(word);
}
for (int i = words.size() - 1; i >= 0; i--) {
cout << words[i] << ' ';
}
}
// 64 位输出请用 printf("%lld")
第二轮
第一版(格式错误,0/10)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s);
istringstream iss(s);
string word;
vector<string> words;
while(iss >> word){
words.push_back(word);
}
for(int i = words.size() - 1; i >= 0; i--){
if(i != words.size()) cout << ' ';
cout << words[i];
}
return 0;
}
// 64 位输出请用 printf("%lld")
- 程序输出的格式不符合要求(比如空格和换行与要求不一致)
- 仔细观察,是
if(i != words.size()) cout << ' ';这里写错了。
第二版(AC)
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s;
getline(cin, s);
istringstream iss(s);
string word;
vector<string> words;
while(iss >> word){
words.push_back(word);
}
for(int i = words.size() - 1; i >= 0; i--){
if(i != words.size() - 1) cout << ' ';
cout << words[i];
}
return 0;
}
// 64 位输出请用 printf("%lld")
- 注意到第一轮最后一版和这一版的输出格式有所区别,这一版的最后一个单词输出后,并不会再输出空格,但第一轮的版本会。
- 然而,两者都通过了测试,这说明测试用例忽略了行末的空格(只检查单词顺序不检查空格这个猜测被之前的经验否掉了)。