题解 | #阅读理解#

阅读理解

https://www.nowcoder.com/practice/199904c4134b48ffbc48032a5373fb7c

题目描述

英语老师布置了 篇阅读理解作业。对于若干给定的生词,老师想知道它们分别出现在了哪些短文中,以便统计查词量。

给定 篇短文与 次查询,每次给出一个单词 ,请输出 出现过的所有短文编号(按升序),若从未出现则输出空行。

本题是哈希表赢麻了的题

核心思路

核心观察

  • 每篇短文可视为一个单词集合(因为同一单词在同一篇中重复出现只需记录一次)。
  • 查询要求:对每个单词 ,快速找出它出现在哪些文章中。
  • 由于 、每篇文章最多 50 个单词、总单词种类有限,可以预处理:为每篇文章建立一个哈希集合(unordered_set),用于快速判断某单词是否在该文中出现。
  • 查询时,遍历所有文章编号 ,检查当前单词是否在第 篇的集合中。由于题目要求按升序输出,而我们正是从小到大遍历,天然满足顺序。

注意:不能反向建索引(如 map<string, vector<int>>)虽然更高效,但本题数据规模小,直接遍历完全可接受,且代码简洁。

算法步骤

  1. 读入
  2. 对每篇短文
    • 读入单词数量
    • 读入 个单词,插入到 v[i]unordered_set<string>)中。
  3. 读入查询次数
  4. 对每个查询单词
    • 遍历
      • v[i].count(w) == 1,输出 i 并加空格。
    • 输出换行(即使无结果,也输出空行)。

正确性分析

  • 使用 unordered_set 可以在平均 时间内判断单词是否存在。
  • 遍历文章编号从 1 到 ,保证输出编号严格升序。
  • 每次查询独立处理,互不影响。
  • 空行处理:若没有任何文章包含该词,则循环中不输出任何数字,直接 cout << endl; 即为空行,符合要求。

复杂度分析

  • 时间复杂度
    • 预处理:
    • 查询:,在 C++ 中可接受。
  • 空间复杂度,存储所有单词。

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    int n;cin>>n;
    vector<unordered_set<string>>v(n+1);
    for(int i=1;i<=n;i++){//从1开始存入
        int tem;cin>>tem;
        v[i].reserve(tem);//重设哈希表大小避免多次申请大内存
        for(int j=0;j<tem;j++){
            string s;cin>>s;
            v[i].insert(s);
        }
    }
    int q;cin>>q;
    while(q--){
        string s;
        cin>>s;
        for(int i=1;i<=n;i++){
            if(v[i].count(s)){//统一API,count就是查找返回bool
                cout<<i<<" ";
            }
        }
        cout<<endl;
    }
}

全部评论

相关推荐

当年还在美团那个倒霉的&nbsp;Peppr&nbsp;团队工作时,我一直有个疑问:这群人每天到底在自嗨什么。每次开会一堆人围着一堆“看起来很高级”的文档转,模板统一、名词复杂、页数感人,每一页都在暗示一件事:“你不懂,是因为你不专业。”但现实是——代码照样写在&nbsp;💩&nbsp;山上,该出问题还是会出问题,这真的很逗,系统一出问题,文档的唯一作用就是证明:“我们当初确实认真写过文档。”所以本质区别到底是什么?是代码质量提升了,还是大家在精神层面完成了一次“工程师&nbsp;cosplay”?有句话说得好潮水退去才知道谁在裸泳。还记得当时的马哥、明哥(图&nbsp;1&nbsp;左)最爱反复强调一句话:“所有场景一定要想到。”、“这个场景为什么没考虑到?”不过他们这些话我是真的听进去了。不然我也不会在一年多前就说:这个项目活不过两年。顺带一提,那段时间还有个固定节目。每次下楼,总能听见我明哥在吐槽不同的人。我从他身后绕过去,经常能听到他一边抽烟一边说:“xx&nbsp;这小子太坑了,回头我一定要跟马哥说说。”于是深谙人情世故但真不会抽烟的我也会从口袋掏出一支低尼古丁含量的烟给自己点上,假意自己什么都没听到什么都不知道,只是来抽烟的。后来我才明白,这可能也是团队文化的一部分:问题永远在别人身上,而我们,永远在复盘里😂。
秋招白月光
点赞 评论 收藏
分享
01-14 16:23
广州商学院 Java
双非后端失败第N人:如果准备好了可以直接投字节,字节是最不看学历的,只要想面,大概率都能给你约面。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务