PAT 甲级刷题实录——1022

本贴最后更新于 1923 天前,其中的信息可能已经东海扬尘

原题链接

思路

题目给出了一些书籍的信息,每本书籍分别包含 ID、标题、作者等信息。输入的是任意种类的书籍信息,要求输出和该信息对应的所有书籍 ID,且要顺序输出。题目中对于输入的信息分别给出了从 1 到 5 的编号代表信息种类,但实际上我们完全不需要知道给的输入到底是什么信息,一个暴力的做法就是创建一个 map<string,set >,其中第一个 string 代表书籍信息字符串,set 则存储了该书籍信息对应的所有书籍 ID。set 也可以改成 vector,不过 vector 需要手动排序,set 是自动排序的。我们在读取书籍信息时,每读取一种信息就将该信息对应的 ID 存入 set。其中需要注意的是,关键字信息需要一个单词一个单词读取,而其他信息需要整行读取。整行读取的方法是 getline(cin,s) ,s 代表字符串变量。getline 是默认读到换行符就终止读取的,因此如果读到的第一个字符就是换行符,getline 就会读到空字符串。网上有人说 getline 不会读取换行符,因此在 getline 后面还要加一个 getchar 才能继续,我估计他是和其他的哪个方法弄混了。不过我倒发现了 cin 方法是不会读取换行符,因此在使用 cin 方法后如果想使用 getline 方法的话,需要在 cin 后面加上 getchar。另外关于如何读取一行中所有的单词而不读到下一行,即读取 key word 的过程,网上的大神也给出了方法,代码如下:

while (cin >> keyword) { //这里写操作语句 if (cin.get() == '\n') break; }

完整代码

#include <iostream> #include <set> #include <map> #include <string> using namespace std; int main() { map<string, set<string> > search; int N, M; cin >> N; for (int i = 0; i < N; i++) { string ID, title, author, keyword, publisher, year; cin >> ID; getchar(); getline(cin, title); search[title].insert(ID); getline(cin, author); search[author].insert(ID); while (cin >> keyword) { search[keyword].insert(ID); if (cin.get() == '\n') break; } getline(cin, publisher); search[publisher].insert(ID); cin >> year; search[year].insert(ID); } cin >> M; for (int i = 0; i < M; i++) { string num, word; cin >> num; getchar(); getline(cin, word); cout << num << ' ' << word<<endl; if (search.find(word) != search.end()) { for (set<string>::iterator it = search[word].begin(); it != search[word].end(); it++) { cout << *it << endl; } } else { cout << "Not Found" << endl; } } return 0; }
  • PAT
    25 引用 • 1 回帖 • 1 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...