Java - 给出一个单词后,帮助找到出现最多的字母和这个字母出现的次数。
## 给出一个单词后,帮助找到出现最多的字母和这个字母出现的次数。**要求:
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
如果有多个字母出现的次数相等,输出字典序最小的那个。**
## 思路一
**由字母-字母出现的次数,想到key-value,再想到HashMap;
题中要求 如果有多个字母出现的次数相等,输出字典序最小的那个。HaspMap会按key自动排序,满足要求**
```java
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);
```
```java
//输入
fffffsjshkhdkjhcbbbbbaa
//输出
b
5
运行时间343ms < 1 s,满足要求
```
## 思路二
**定义一个长为26数组。数组的每一位的值代表这个字母出现的次数**
```java
Scanner sc =new Scanner(System.in);
String str = sc.nextLine();
//定义一个长度为26的数组 来存放26个字母分别出现的次数;arr是a出现的次数
int arr[] =new int ;
//初始化数组,假设每个字母都没出现
for (int i = 0; i < arr.length; i++) {
arr = 0;
}
//将字母转为ASCII
for (int i = 0; i < str.length(); i++) {
int ascII = str.charAt(i) - 'a';
//System.out.print(ascII+" ");
arr++;//对应位置的字母出现次数+1
}
//判断哪个ascii出现最多
//假设第一个数最大
int max =arr;
char word =' ';
for (int i = 0; i < arr.length; i++) {
if(arr>max) {
max =arr;
//System.out.println(i+'a'); //判断这个字母的位置,因为上面-a了,加回来就是它的ASCII码
word = (char)('a' + i); //强制转换一下就是 它本身了
}
}
System.out.println(word);
System.out.println(max); //System.out.println(max);这就是该字母出现的字数
``` 你弄错了,不是HashMap,是TreeMap,你这次输出恰好和字典序相同可能是因为它们的哈希值刚好挨着的,换成若干长度不等的单词再试试 import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
int[] count = new int;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (c >= 'a' && c <= 'z') {
count++;
} else if (c >= 'A' && c <= 'Z') {
count++;
}
}
int maxCount = 0;
char maxChar = 'a';
for (int i = 0; i < 26; i++) {
if (count > maxCount) {
maxCount = count;
maxChar = (char) ('a' + i);
} else if (count == maxCount && (char) ('a' + i) < maxChar) {
maxChar = (char) ('a' + i);
}
}
System.out.println(maxChar + " " + maxCount);
}
}
万神fake 发表于 2023-3-19 17:33
import java.util.*;
public class Main {
chatgpt写的,不知道对不对 来个C++的
#include <bits/stdc++.h>
using namespace std;
signed main() {
int cnt; memset(cnt, 0, sizeof cnt);
string str; cin >> str;
for (char c : str) cnt++;
int res = 0; char c;
for (int i = 1; i < 26; ++i)
if (cnt > cnt) res = i;
c = res + 'a';
cout << c << endl << cnt;
return 0;
} 这题是标准题库中的题吧 答得很好,受益匪浅 HashMap是无序的吧
System.out.println(list.get(0)); 这一步有侥幸的成分。 //因为要求是按字典序输出,所以如果最大值有重复的,取第一个就好
这里不太对吧,这个不符合按字典顺序了 我记得hashMap是无序的吧
页:
[1]
2