# Hash Table# Counting# Map

d885 - NOIP2007 1.統計數字 番外篇

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一組自然數,統計每個自然數出現的次數,並按照自然數從小到大的順序輸出每個自然數及其出現次數。

解題思路

本題可以使用 Hash Table (具體實作為 C++ 的 map) 來統計每個數字的出現次數。map 能夠自動按照 key (也就是數字) 的大小進行排序。程式首先讀取數字的個數 n,然後讀取 n 個數字,並使用 map 記錄每個數字出現的次數。最後,遍歷 map,按照 key 的順序輸出每個數字及其對應的次數。

複雜度分析

  • 時間複雜度: O(n log n) (map 的插入和查找操作平均時間複雜度為 log n,總共進行 n 次操作)
  • 空間複雜度: O(k) (k 為不相同數字的個數,最壞情況下 k = n)

程式碼

#include <iostream>
#include <map>
using namespace std;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	long long int a,b;
	map <int,int> ans;
	map <int,int> ::iterator iter;
	cin >> a;
	while(a--){
		cin >> b;
		(ans.find(b)==ans.end())?ans[b]=1:ans[b]++;
	}
	for(iter=ans.begin();iter!=ans.end();iter++){
		cout << iter->first << " " << iter->second << "\n";
	}
}

Discussion