给出一个单词后,帮助找到出现最多的字母和这个字母出现的次数。
要求:
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
如果有多个字母出现的次数相等,输出字典序最小的那个。
思路一
由字母-字母出现的次数,想到key-value,再想到HashMap;
题中要求 如果有多个字母出现的次数相等,输出字典序最小的那个。
Scanner sc =new Scanner(System.in);
String n = sc.nextLine();
//字母 - 次数 想到 key -value
HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
//把单词的每个字母都放进去
for (int i = 0; i < n.length(); i++) {
//判断hashmap中是否包含这个字母
if(!hashMap.containsKey(n.charAt(i))) {
//如果不包含,则把这个字母放进来
hashMap.put(n.charAt(i),1);
}else {
//如果包含,value+1
hashMap.put(n.charAt(i), hashMap.get(n.charAt(i))+1);
}
}
//System.out.println(hashMap); //打印hashmap,结果正常
//获取最大的value
int maxnum = Collections.max(hashMap.values());
//System.out.println(num); //打印hashmap,结果正常
//通过hashmap的value获取key; 定义一个list来存放key
List<Character> list =new ArrayList<Character>();
//keySet() 方法返回映射中所有 key 组成的 Set 视图
//因为不知道 key具体情况,直接用增强for循环
for (Character key :hashMap.keySet()) {
if(hashMap.get(key).equals(maxnum)) { //如果对应的value == 最大值,直接放入list
list.add(key); //获得了一个包含相同value的key的list
}
}
//因为要求是按字典序输出,所以如果最大值有重复的,取第一个就好
System.out.println(list.get(0));
System.out.println(maxnum);
//输入
fffffsjshkhdkjhcbbbbbaa
//输出
b
5
运行时间343ms < 1 s,满足要求
思路二
定义一个长为26数组。数组的每一位的值代表这个字母出现的次数
Scanner sc =new Scanner(System.in);
String str = sc.nextLine();
//定义一个长度为26的数组 来存放26个字母分别出现的次数;arr[0]是a出现的次数
int arr[] =new int [26];
//初始化数组,假设每个字母都没出现
for (int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
//将字母转为ASCII
for (int i = 0; i < str.length(); i++) {
int ascII = str.charAt(i) - 'a';
//System.out.print(ascII+" ");
arr[ascII]++;//对应位置的字母出现次数+1
}
//判断哪个ascii出现最多
//假设第一个数最大
int max =arr[0];
char word =' ';
for (int i = 0; i < arr.length; i++) {
if(arr[i]>max) {
max =arr[i];
//System.out.println(i+'a'); //判断这个字母的位置,因为上面-a了,加回来就是它的ASCII码
word = (char)('a' + i); //强制转换一下就是 它本身了
}
}
System.out.println(word);
System.out.println(max); //System.out.println(max);这就是该字母出现的字数