ECNU 2852 统计字母频率
链接
https://acm.ecnu.edu.cn/problem/2852
题目
单点时限: 2.0 sec
内存限制: 256 MB
给定一个由若干单词构成的英文句子,单词与单词之间用空格分隔。每个单词只包含小写的英文字母(a~z)。一个句子中的单词个数最多不超过 100 个,而每个单词中包含字母的个数不超过 30 个。
请找出在句子中出现频率最高的字母,并输出该字母出现的频率(精确到小数点后 2 位)。
输入格式
输入一行,表示一个句子。
输出格式
在一行中输出出现频率最高的字母,以及该字母出现的频率(精确到小数点后 2 位),两者之间用一个空格分隔。如果存在多个字母满足要求,则按照字典顺序做升序排序,输出最小的字母。
样例
input
enjoy the acm icpc programming contest
output
c 0.12
思路
首先输入要用next,这样读取空格,之后遍历,26个字母就拿数组存放出现次数,同时用count记录字母的总数。
接下来从后往前找到最大的那个数,这里用大于等于,因为优先用前面的字母。
转换成字母并输出,随后输出频率,这里频率有点坑,我先转成double再除就是对了,不转就是错的。
代码
public static void fun() {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
StringBuffer sb = new StringBuffer(str);
int[] a = new int[27];
int count = 0;
for (int i = 0; i < sb.length(); i++) {
char temp = sb.charAt(i);
if (temp >= 'a' && temp <= 'z') {
a[temp - 'a']++;
count++;
}
}
int max = a[25];
int tag = 25;
for (int i = 24; i >= 0; i--) {
if (a[i] >= max) {
max = a[i];
tag = i;
}
}
char ans = (char) (tag + 'a');
double pin = (double) max / (double) count;
System.out.print(ans + " ");
DecimalFormat df = new DecimalFormat("0.00");
System.out.print(df.format(pin));
}