c++有n个范围是-1e9~1e9的数,去统计每个数的个数?
在C++中,统计每个数的个数可以使用std::map
或std::unordered_map
来高效地存储和查询每个数的出现次数。由于数的范围很大(-1e9到1e9),使用数组来直接索引是不现实的,因此使用哈希表(std::unordered_map
)是一个更好的选择。
#include <iostream>
#include <unordered_map>
#include <vector>
int main() {
int n;
std::cin >> n; // 输入数的个数
std::unordered_map<int, int> countMap; // 用于存储每个数的出现次数
std::vector<int> numbers(n); // 存储输入的n个数
// 输入n个数
for (int i = 0; i < n; ++i) {
std::cin >> numbers[i];
}
// 统计每个数的出现次数
for (int num : numbers) {
countMap[num]++;
}
// 输出每个数的出现次数
for (const auto& pair : countMap) {
std::cout << "Number " << pair.first << " appears " << pair.second << " times." << std::endl;
}
return 0;
}
代码说明:
-
输入处理:首先输入数的个数
n
,然后输入n
个数并存储在std::vector<int>
中。 -
统计次数:使用
std::unordered_map<int, int>
来统计每个数的出现次数。countMap[num]++
会自动处理新数的插入和已有数的计数。 -
输出结果:遍历
countMap
,输出每个数及其出现次数。
复杂度分析:
-
时间复杂度:插入和查询操作在
std::unordered_map
中的平均时间复杂度是O(1),因此总的时间复杂度是O(n)。 -
空间复杂度:最坏情况下,所有数都不同,空间复杂度为O(n)。
注意事项:
-
如果数的范围较小且分布密集,可以考虑使用数组来统计,但在这个问题中,数的范围太大,使用哈希表是更合适的选择。
-
std::unordered_map
是基于哈希表的实现,而std::map
是基于红黑树的实现。如果不需要有序输出,std::unordered_map
通常更快。