第33次认证题解反思(持续更新)
一、词频统计
(一)题目要求
(二)题目分析
1、用什么数据结构存储:由于需要统计单词i的出现频次(出现在多少篇、共出现多少次),可以将每篇文章的单词都保存下来,但是这里有一个问题,就是每篇文章的长度是不同的,不能用数组进行存储,而vector存储个数是可变的,故而可以用vector的二维数组进行存储;
2、如何统计单词i的出现频次:对于问题1,只需要记录某篇文章中是否出现单词i,重复的单词可以忽略,无序集(unordered set)的特性正好满足了该要求;
3、注意是否需要一定使用vector数组。
(三)代码编写
#include <stdio.h>
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int n, m;
cin >> n >> m;//共n篇文章,最多m类单词
vector<vector<int>> articles(n);//定义一个n行的vector数组articles保存n篇文章的内容
//读入n篇文章的内容
for (int i = 0; i < n; ++i) {
int length;
cin >> length;//article(i)的单词个数
vector<int> words(length);//用words[]暂时存储article(i)的内容
for (int j = 0; j < length; ++j) {
cin >> words[j];
}//每次读入一篇文章的内容
articles[i] = words;//将这篇文章复制到articles中
}
//分别保存m个单词出现篇数及总出现次数
vector<int> count_articles(m + 1,0);
vector<int> count_words(m + 1,0);
unordered_set<int> myset;
//统计频率
for (int i = 0; i < n; ++i) {
myset.clear();//清除容器中内容
for (int j = 0; j < articles[i].size(); j++) {
int word;
word = articles[i][j];
if (myset.find(word) == myset.end()) {//使用find()函数时,如果能够找到word,则返回指向word的迭代器,否则返回指向end的迭代器
count_articles[word]++;
myset.insert(word);//word在articles[i]中首次出现
}
count_words[word]++;//统计word总出现频次
}
}
//结果输出
for (int i = 1; i < m + 1; ++i) {
cout << count_articles[i] << " " << count_words[i] << endl;
}
return 0;
}
(四)知识回顾
1、vector
①初始化
②vector与二维数组
原文1:vector的定义与使用、接口函数等
原文2:vector与二维数组
2、无序集
①初始化;
②接口函数的使用;
③返回迭代器的方式;
原文地址:unordered_set库的使用