微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输入格式:
输出格式:
统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔1个空格。如果有并列,则输出编号最大的那个。
输入样例:
4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123
输出样例:
233 3
ACcode:
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n; //微博条数
map<int, int> tagCount; // 使用map来统计每个特性标签的出现次数
for(int i=0; i<n; i++){
int k;
cin >> k; //一条微博中的特性个数
for(int j=0; j<k; j++){
int tag; //标签特性编号
cin >> tag;
tagCount[tag]++;
}
}
int maxTag = -1;
int maxCount = -1;
//遍历 map
for(auto it=tagCount.begin(); it!=tagCount.end(); it++){
if(it->second > maxCount || (it->second == maxCount && it->first > maxTag)){
maxTag = it->first;
maxCount = it->second;
}
}
cout << maxTag << " " << maxCount;
return 0;
}
1. 为什么用map
使用map的主要原因是我们需要统计每个特性标签的出现次数,并且要根据标签编号快速获取对应的计数值。map 是一种关联容器,它将键值与值关联起来,使得通过键(这里是特性标签编号)可以快速地找到对应的值(出现次数)。这样可以有效地处理统计问题。
2. map的遍历方式
for (auto it = tagCount.begin(); it != tagCount.end(); ++it) {
//使用 auto 的好处是,编译器会根据右边的初始化值自动推断出 it 的类型,使代码更加简洁和易读。在这种情况下,it 是一个 std::map<int, int>::iterator 类型的迭代器,指向 tagCount 这个 map 的元素。
}
3.map迭代器用法
在 C++ 中,map 是一种关联容器,其中的元素是按键值对的形式存储的。每个元素都有一个键(key)和一个值(value)。在遍历 map 时,你可以使用迭代器(iterator)来访问每个键值对。
it->first:这是一个迭代器的用法,用于访问当前迭代器所指向的键(即键值对中的“key”)。
it->second:同样,这也是一个迭代器的用法,用于访问当前迭代器所指向的值(即键值对中的“value”)。
4.tagCount.end()指向哪里?
tagCount.end() 指向的是 map 的“超越尾部”的位置,而不是最后一个元素。在 C++ 的容器中,begin() 指向第一个元素,而 end() 指向的是超越尾部的位置,它不包含任何有效元素。