吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1586|回复: 12
收起左侧

[Java 原创] Java - 给出一个单词后,帮助找到出现最多的字母和这个字母出现的次数。

  [复制链接]
dxxbjl 发表于 2023-3-19 16:19

给出一个单词后,帮助找到出现最多的字母和这个字母出现的次数。

要求:
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
如果有多个字母出现的次数相等,输出字典序最小的那个。

思路一

由字母-字母出现的次数,想到key-value,再想到HashMap;
题中要求 如果有多个字母出现的次数相等,输出字典序最小的那个。HaspMap会按key自动排序,满足要求

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

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
0106yingzi + 1 + 1 热心回复!
Reelye + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

侃遍天下无二人 发表于 2023-3-19 22:29
你弄错了,不是HashMap,是TreeMap,你这次输出恰好和字典序相同可能是因为它们的哈希值刚好挨着的,换成若干长度不等的单词再试试
万神fake 发表于 2023-3-19 17:33
[Java] 纯文本查看 复制代码
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[26];
        for (int i = 0; i < input.length(); i++) {
            char c = input.charAt(i);
            if (c >= 'a' && c <= 'z') {
                count[c - 'a']++;
            } else if (c >= 'A' && c <= 'Z') {
                count[c - 'A']++;
            }
        }
        int maxCount = 0;
        char maxChar = 'a';
        for (int i = 0; i < 26; i++) {
            if (count[i] > maxCount) {
                maxCount = count[i];
                maxChar = (char) ('a' + i);
            } else if (count[i] == 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
[mw_shl_code=java,true]import java.util.*;

public class Main {

chatgpt写的,不知道对不对
jmxjiamingxu 发表于 2023-3-19 20:56
来个C++的
[C++] 纯文本查看 复制代码
#include <bits/stdc++.h>

using namespace std;

signed main() {
    int cnt[26]; memset(cnt, 0, sizeof cnt);
    string str; cin >> str;
    for (char c : str) cnt[c - 'a']++;
    int res = 0; char c;
    for (int i = 1; i < 26; ++i) 
        if (cnt[i] > cnt[res]) res = i;
    c = res + 'a';
    cout << c << endl << cnt[res];
    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
[Java] 纯文本查看 复制代码
 //因为要求是按字典序输出,所以如果最大值有重复的,取第一个就好 

这里不太对吧,这个不符合按字典顺序了
shiyi617 发表于 2023-3-20 16:51
我记得hashMap是无序的吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表