# Frequency Analysis# String Processing# Counting

e503 - 00499 - What's The Frequency, Kenneth?

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取多行文字,對於每一行文字,找出其中出現頻率最高的字母(不區分大小寫),並輸出該字母以及其出現次數。如果有多個字母出現頻率相同,則按照字母表順序(A-Z, a-z)輸出。

解題思路

程式碼使用一個大小為 55 的整數陣列 ans 來儲存每個字母的出現次數。陣列的索引 0-25 對應大寫字母 A-Z,索引 26-51 對應小寫字母 a-z。程式遍歷輸入字串,對於每個字符,如果它是字母,則將對應索引的計數器加 1。同時,程式追蹤目前出現次數最多的字母的次數 ma。最後,程式遍歷 ans 陣列,輸出所有出現次數等於 ma 的字母,按照字母表順序輸出。

複雜度分析

  • 時間複雜度: O(N*M),其中 N 是輸入字串的行數,M 是每行字串的長度。因為需要遍歷每一行字串,並更新字母出現次數。
  • 空間複雜度: O(1),因為 ans 陣列的大小是固定的 (55),不隨輸入大小變化。

程式碼

#include <iostream>
using namespace std;
int main() {
	ios::sync_with_stdio(false);cin.tie(0);
	string a;
	while(getline(cin,a)){
		int ans[55]={0},ma=0,al=a.length();
		for(int i=0;i<al;++i){
			if(a[i]>='A'&&a[i]<='Z'){
				++ans[a[i]-'A'];
				ma=max(ans[a[i]-'A'],ma);
			}
			else if(a[i]>='a'&&a[i]<='z'){
				++ans[a[i]-'a'+26];
				ma=max(ans[a[i]-'a'+26],ma);
			}
		}
		for(int i=0;i<26;++i)
			if(ans[i]==ma)
				cout << (char)('A'+i);
		for(int i=26;i<55;++i)
			if(ans[i]==ma)
				cout << (char)('a'+i-26);
		cout << " " << ma << "\n";
	}
}

Discussion