e503 - 00499 - What's The Frequency, Kenneth?
題目描述
題目要求讀取多行文字,對於每一行文字,找出其中出現頻率最高的字母(不區分大小寫),並輸出該字母以及其出現次數。如果有多個字母出現頻率相同,則按照字母表順序(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";
}
}