dxxbjl 发表于 2023-3-19 16:19

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);这就是该字母出现的字数
```

侃遍天下无二人 发表于 2023-3-19 22:29

你弄错了,不是HashMap,是TreeMap,你这次输出恰好和字典序相同可能是因为它们的哈希值刚好挨着的,换成若干长度不等的单词再试试

万神fake 发表于 2023-3-19 17:33

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:35

万神fake 发表于 2023-3-19 17:33
import java.util.*;

public class Main {


chatgpt写的,不知道对不对

jmxjiamingxu 发表于 2023-3-19 20:56

来个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;
}

b286123 发表于 2023-3-19 21:25

这题是标准题库中的题吧

Abcdefge 发表于 2023-3-20 09:35

答得很好,受益匪浅

hero2022 发表于 2023-3-20 11:51

HashMap是无序的吧
System.out.println(list.get(0)); 这一步有侥幸的成分。

AbcDavid 发表于 2023-3-20 16:43

//因为要求是按字典序输出,所以如果最大值有重复的,取第一个就好
这里不太对吧,这个不符合按字典顺序了

shiyi617 发表于 2023-3-20 16:51

我记得hashMap是无序的吧
页: [1] 2
查看完整版本: Java - 给出一个单词后,帮助找到出现最多的字母和这个字母出现的次数。