CCFCSP题解+知识点

第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库的使用

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值