Atcoder ABC338 B - Frequency

Frequency(频率)

时间限制:2s 内存限制:1024MB

【原题地址】

点击此处跳转至原题

【问题描述】

给你一个由小写英文字母组成的字符串 S 。请找出在 S 中出现频率最高的字符。如果存在多个这样的字符,请报告按字母顺序排列最早的那个。

【输入格式】

输入内容由标准输入法提供,格式如下
S

1≤∣S∣≤1000 (∣S∣是字符串 S 的长度。)
S 中的每个字符都是小写英文字母。

【输出格式】

在 S 中出现频率最高的字符中,按字母顺序打印最早出现的字符。

【样例输入】

样例一、

frequency

样例二、

atcoder

【样例输出】

样例一、

e

样例二、

a

【样例说明】

对于第一个测试用例,在 frequency 中,字母 e 出现了两次,比任何其他字符都多,因此应该打印 e。

对于第二个 测试用例,在 atcoder 中,每个字母 a、t、c、o、d、e 和 r 都出现一次,因此应按字母顺序打印最早的字母,即 a。

【解题思路】

老汉使用到的是暴力枚举的解题方式

本题是求字符串 s 中出现频率最高且在字母表中顺序较早的字母
通过遍历字符串,用数组下标做字母标记,记录出现次数,记录完之后,遍历记录数组,找出频率最高,且顺序较早的字母。

又水了一篇文章,希望各位能谅解。

代码注释有详细过程

【代码】

package ABC338_B_Frequency;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String s = scan.next();
		// 定义数组count,记录下标对应字母的出现次数
		int[] count = new int['z' + 1];
		// 遍历s,获取出现次数
		for (char c : s.toCharArray()) {
			count[c]++;
		}
		// max_cr存放出现次数最多且字母顺序最早的字母,初始化为a
		char max_cr = 'a';
		// 遍历count数组,求得最终答案
		for (int i = 'b'; i <= 'z'; i++) {
			// 为了保证字母顺序最早,只有在大于它时才进行取值
			if (count[i] > count[max_cr]) {
				max_cr = (char) i;
			}
		}
		// 输出答案
		System.out.println(max_cr);
		scan.close();
	}
}

你可能感兴趣的:(Java算法题解,算法,java)