pat 甲级 1022 Digital Library

这篇文章介绍了如何使用C++编程处理一个包含书籍信息的数据结构,包括ID、标题、作者、关键词、出版社和年份,通过stringstream进行字符串分割和整行读取,以实现根据标题、作者、关键词、出版社和年份查找书籍的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题为模拟题,相对简单,只是处理起来较为麻烦。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
#include<vector>
#include<sstream>

using namespace std;
const int N=10010,M=1010;
int n;
struct book{
    string id,title,author;
    set<string>key;
    string publisher,years;
};
int main()
{
    cin>>n;
    getchar();
    vector<book> books;
    for(int i=0;i<n;i++){
        string id,title, author;
        cin >> id;
        getchar();
        getline(cin, title);
        getline(cin, author);
        string line;
        getline(cin,line);
        stringstream ssin(line);
        string keyword;
        set<string> keywords;
        while (ssin >> keyword) keywords.insert(keyword);
        string publisher, year;
        getline(cin, publisher);
        cin >> year;
        books.push_back({id, title, author, keywords, publisher, year});
    }
    int m;
    cin>>m;
    getchar();
    while(m--){
        string query;
        getline(cin,query);
        cout<<query<<endl;
        int id=query[0]-'0';
        string s=query.substr(3);
        vector<string> ids;
        if(id==1){
            for(auto& book:books)
                if(book.title==s) 
                    ids.push_back(book.id);
        }
        else if(id==2){
            for(auto& book:books)
                if(book.author==s) 
                    ids.push_back(book.id);
        }
        else if(id==3){
            for(auto& book:books)
               if(book.key.count(s)) 
                   ids.push_back(book.id);
        }
        else if(id==4){
            for(auto& book:books)
                if(book.publisher==s) 
                    ids.push_back(book.id);
        }
        else if(id==5){
            for(auto& book:books)
                if(book.years==s) 
                    ids.push_back(book.id);
        }
      
        if(ids.size()==0)    cout<<"Not Found"<<endl;
        else {
            sort(ids.begin(),ids.end());
            for(auto id:ids)
                cout<<id<<endl;
        }
    }
    return 0;
}

处理方法:

1.分隔符为单个字符时

stringstream类是<sstream>头文件中定义的流之一, 它的操作类似于cin、cout,常用于数据类型的转换(字符串转为数值型),除此之外还能用来对字符串进行分割操作。

stringstream类中常用的函数有:

  1. str():返回stringstream对象中的字符串。
  2. str(string s):先清空,然后将字符串s赋值给stringstream对象。
  3. clear():清空stringstream对象中的内容。
  4. operator<<():向stringstream对象中插入数据,默认是直接在末尾插入数据,但是如果前面调用了2函数再使用此操作则会直接从头开始插入。
  5. operator>>():从stringstream对象中提取数据,操作类似于cin、cout

例子:

将字符串"Hello World! My name is C++"按空格分割。

由于中间是由空白符做分割,而c++输入流是默认跳过空白符的所以可以直接只用>>操作将其进行分割。

Code


string s = "Hello World! My name is C++", t;
stringstream ss;
ss << s; //将s字符串写入到流中,写成ss.str(s)或者ss(s)也可以
vector<string> res;
while (ss >> t)
    res.push_back(t);
for (auto s : res)
    cout << s << endl;

2.读取整行的字符串(含有空格)

getline(cin,line);

注意如果前面的cin>>n,需要用getchar()读取后面的换行符然后在使用getline();

### 关于 PAT 甲级真题 1172 的解析 PAT (Programming Ability Test) 是一项针对编程能力的测试,其中甲级难度较高,涉及算法设计与实现。以下是关于题目 **1172** 的相关内容。 #### 题目描述 根据已知的信息[^1]以及公开资源中的整理[^2],PAT 甲级真题 1172 被命名为《Digital Library》。该题目主要考察字符串处理、数据结构的应用以及输入输出优化等内容。具体要求如下: - 输入一系列书籍信息(包括书名、作者、关键词、出版社和出版年份),并按照指定条件查询匹配的结果。 - 查询方式分为五种: 1. 按照书名查找; 2. 按照作者查找; 3. 按照关键词查找; 4. 按照出版社查找; 5. 按照出版年份查找。 每本书籍最多被查找到一次,即使它满足多个查询条件。 --- #### 解决方案概述 为了高效解决此问题,可以采用以下方法: ##### 数据存储 定义一个 `Book` 类来表示一本书的主要属性,便于统一管理书籍信息。代码示例如下: ```cpp struct Book { int id; // 图书编号 string title; // 书名 string author; // 作者 vector<string> tags; // 关键词列表 string publisher; // 出版社 int year; // 出版年份 }; ``` ##### 处理逻辑 通过构建多关键字索引来加速查询操作。对于不同的查询类型,分别建立哈希表或其他快速检索的数据结构。例如: - 使用 `unordered_map<string, set<int>>` 存储按书名、作者、出版社等字段的映射关系。 - 对于关键词查询,则需遍历所有书籍逐一比较。 下面是完整的 C++ 实现代码片段: ```cpp #include <iostream> #include <vector> #include <string> #include <unordered_map> #include <set> using namespace std; // 定义图书结构体 struct Book { int id; string title; string author; vector<string> tags; string publisher; int year; }; int main() { int N, M; cin >> N; // 总共N本书 vector<Book> books(N); // 初始化书籍信息 for(int i=0;i<N;i++) { cin >> books[i].id >> books[i].title >> books[i].author >> books[i].tags.size(); // 假设先读取标签数量K books[i].tags.resize(books[i].tags.size()); for(auto &tag : books[i].tags){ cin >> tag; } cin >> books[i].publisher >> books[i].year; } cin >> M; // 查询次数M unordered_map<string, set<int>> titleMap, authorMap, pubMap; // 构建索引... } ``` 上述代码仅展示初始化部分,实际还需补充详细的索引创建及查询功能。 --- #### 注意事项 在开发过程中需要注意以下几个方面: - 输入规模较大时应考虑性能优化,比如减少不必要的字符串拷贝操作。 - 输出格式严格遵循样例说明,任何多余的空格或换行都会导致评测失败。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值