相关知识

  1. 字符串反转(HJ5)、句子逆序(HJ6),除此以外还有哪些类似的常见题型?解法有何区别? 反转句子中每个单词内部的字符顺序,但保持单词顺序不变。——在逐一把单词加入vector<string>之前先用reverse()翻转一次。每隔一段固定距离,反转一次。——按固定距离截取字符串,反转后再追加到新字符串里。句子逆序,反转单词顺序,但单词的分隔符既有空格又有逗号。——逗号统一换成空格。
  2. istringstream的用法是什么? 在这道题中,iss以空格为分隔将字符串s中的单词逐一的输入到字符串word中,再把word添加到字符串向量words里。另一种用法是getline(iss, s, ','),这可以把iss中的字符以,分隔出去,常用于处理CSV文件。
  3. 在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。
  4. 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")

  1. 程序输出的格式不符合要求(比如空格和换行与要求不一致)
  2. 仔细观察,是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")

  1. 注意到第一轮最后一版和这一版的输出格式有所区别,这一版的最后一个单词输出后,并不会再输出空格,但第一轮的版本会。
  2. 然而,两者都通过了测试,这说明测试用例忽略了行末的空格(只检查单词顺序不检查空格这个猜测被之前的经验否掉了)。