ECNU 2852 统计字母频率

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));
  }
原文地址:https://www.cnblogs.com/blogxjc/p/14295310.html