1042の文字統計(20点)
与えられた期間のテキストで表示され、最も頻繁に手紙を識別するためのプログラムを作成してください。
入力フォーマット:
1000超えない行の文字列の所定の長さを入力してください。ASCIIコード表の文字列少なくとも1つの英語の文字を含む任意の目に見える文字とスペース構図、キャリッジリターンと終了(入力カウントしません)。
出力フォーマット:
アルファベットの文字や行の出現の出力が表示されますの数の最高周波数は、それらの間のスペースで区切られています。そこに並んで、出力アルファベット順で最小、その文字の場合。大文字小文字を区別しない統計情報、小文字の出力。
サンプル入力:
これはTESTシンプルで他の数字と記号がある1&2 3&....。
出力サンプル:
E. 7
私は2つの方法を考えます:
最初は、被験者が唯一必要な統計の手紙であるので、我々は0-25の代わりに、AZおよびAZ(第2)を作ることができ、彼の英語の手紙上のマップの数が、あまりにも面倒です
最初の
#include <iostream>
#include <unordered_map>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct node{//因为用map无法直接排序故要转成结构数组
char zimu;
int count;
};
bool cmp(node a,node b)
{
if(a.count!=b.count){
return a.count>b.count;
}else{
return a.zimu<b.zimu;
}
}
int main()
{
string A;
getline(cin,A);
unordered_map<char,int> cnt;
for(int i=0;i<A.length();i++){
if(A[i]>='A'&&A[i]<='Z'){
cnt[A[i]+32]++;
}else if(A[i]>='a'&&A[i]<='z'){
cnt[A[i]]++;
}
}
vector<node> c;
for(auto it:cnt){
c.push_back({it.first,it.second});
}
sort(c.begin(),c.end(),cmp);
cout<<c[0].zimu<<" "<<c[0].count;
return 0;
}
第2
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char check[1001];
cin.getline(check,1000);
int sum[26]={0};
int i,Sum=0,count;
for(i=0;i<strlen(check);i++){
if(check[i]>='A'&&check[i]<='Z'){
sum[check[i]-'A']++;
}else if(check[i]>='a'&&check[i]<='z'){
sum[check[i]-'a']++;
}
}
for(i=0;i<26;i++){
if(sum[i]>Sum){
Sum=sum[i];
count=i;
}
}
char MAX='a'+count;
cout<<MAX<<" "<<Sum;
}