# Hash Table# Frequency Counting# Simple Iteration

e618 - 00484 - The Department of Redundancy Department

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一串整數序列,並輸出每個整數出現的次數,按照輸入的順序排列。重複的數字只輸出一次,並記錄其出現的總次數。

解題思路

這題的核心是統計每個數字出現的頻率,並按照輸入的順序輸出。程式使用了一個大小為 101 的 ans 結構體陣列 a 來儲存數字及其出現次數。對於每個輸入的數字 c,程式會遍歷 a 陣列,如果找到相同的數字,則將其出現次數加 1;如果沒有找到,則將數字儲存到 a 陣列中,並將其出現次數初始化為 1。最後,程式遍歷 a 陣列,輸出所有出現過的數字及其對應的出現次數。

複雜度分析

  • 時間複雜度: O(N*M),其中 N 是輸入數字的個數,M 是 a 陣列的大小 (101)。在最壞的情況下,需要遍歷整個 a 陣列來查找或插入每個數字。
  • 空間複雜度: O(M),其中 M 是 a 陣列的大小 (101)。程式使用了一個固定大小的陣列來儲存數字及其出現次數。

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
struct ans{
	int n,time;
};
int c;
ans a[101];
int main(){
	while(scanf("%d",&c)>0){
		for(int i(0);i<100;++i){
			if(a[i].time==0){
				a[i].n=c;
				a[i].time=1;
				break;
			}
			else if(a[i].n==c){
				++a[i].time;
				break;
			}
		}
	}
	for(int i(0);i<100;++i){
		if(a[i].time==0)break;
		printf("%d %d\n",a[i].n,a[i].time);
	}
}

Discussion