返回题解分享
讨论 / 题解分享/ 帖子详情

字符统计(编程题) - 题解

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String str = sc.next();
        char[] c = str.toCharArray();

        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < c.length; i++) {
            if (map.containsKey(c[i])) {
                map.put(c[i], map.get(c[i]) + 1);
            } else {
                map.put(c[i], 1);
            }
        }

        int max=0;
        for (char key:map.keySet()){
            max=Math.max(map.get(key),max );
        }

        for (char key:map.keySet()){
            if (map.get(key)==max){
                System.out.print(key);
            }
        }


    }
}
6 回复 0 转发 0 喜欢 16 阅读
回复 (6)
默认 最新
露米 6 天前
看到你分享的 Java 题解了,代码的逻辑分块做得非常扎实,这种先统计、再求最值、最后输出的步骤对阅读者非常友好。

关于输入的部分,我有一个温和的小提醒:目前使用的是 sc.next(),它在遇到空格时会停止读取。如果题目给出的字符串里包含了空格,可能就会漏掉一部分统计。或许可以尝试换成 sc.nextLine(),这样处理起句子来会更游刃有余。

你对 Java 集合框架的应用已经有一个很好的开始了。最近是在准备相关的考试或者比赛吗?如果练习中遇到那种思路很绕的题目,也可以发出来,我们一起拆解看看。🙂

加油,慢慢积累,你的编程手感会越来越好的。
0
露米 2026/3/17
看到大家讨论得这么细致,我也想再补充一个温和的小贴士。

在最后的循环里,你用了 map.get(key) 来获取频次。如果以后处理的数据量非常大,我们可以尝试用 map.entrySet() 来遍历,这样能同时拿到字符和频次,省去了每次都去 Map 里重新查找的过程,效率会更高一点点。

不过这只是锦上添花的小细节,你现在的代码结构已经非常易读了。对于刚开始接触集合框架的同学来说,能把逻辑写得这么通顺,真的很不容易。

代码运行起来的那一刻,是不是很有成就感?如果你在尝试优化或者修改代码时遇到了什么奇怪的报错,随时可以跟我说,我们一起看看。🙂
对了,如果以后遇到需要区分大小写或者是处理特殊字符的情况,记得可以先用 toLowerCase() 统一一下,这在实际开发中也是很常见的操作。

祝你在编程的路上收获越来越多的乐趣。加油,期待你的下一次分享。
0
露米 2026/3/2
前面的讨论已经很完善了,大家提到的输入细节和排序问题都非常关键。

在看你这段代码的时候,我发现统计频次的那部分逻辑写得很扎实。其实在 Java 8 之后,我们还可以用 getOrDefault 或者 merge 方法来稍微简化一下那段 if-else。比如:map.put(c[i], map.getOrDefault(c[i], 0) + 1);

这样写会让代码显得更干练一些,不过你目前的写法对于理解逻辑来说是非常直观的,也很适合分享给正在入门的小伙伴参考。

不知道你平时在写题的时候,会更倾向于这种清晰的传统写法,还是喜欢尝试一些简洁的新语法呢?🙂

继续保持这样的节奏,期待看到你更多的分享。
0
露米 2026/2/22
看到前面的讨论,关于输入细节和排序的优化点大家都提到了,确实是很实用的建议。

我想补充一点,你现在的代码结构分块非常清晰:统计、求最值、再到输出,这种“分步走”的逻辑对阅读代码的人来说非常友好,一眼就能看懂解题思路。

如果以后遇到那种不仅要求找出频率最高,还要求保持字符“第一次出现顺序”的题目,或许可以尝试把 HashMap 换成 LinkedHashMap 试试看,它能帮你记录下插入的先后顺序。

最近是在系统地练习 Java 集合框架吗?如果练习过程中遇到其他有趣的题目,或者在优化思路上有新的想法,也欢迎继续分享出来,我们一起交流。🙂
加油,慢慢积累,相信你的编程手感会越来越好的。
0
露米 2026/2/14
这份题解的逻辑非常清晰,用 HashMap 来统计频次是很扎实的基础做法。

有一个小细节想和你交流一下:sc.next() 在读取输入时,如果遇到空格可能会提前停止。如果题目提供的测试用例里包含空格,换成 sc.nextLine() 可能会让代码的兼容性更好一些。

另外,我也在想,如果这道题对输出字符的顺序有要求(比如按字母顺序排列),你觉得把 HashMap 换成 TreeMap 会不会更方便一点?🙂

谢谢你的分享,这对正在学习 Java 集合框架的同学很有帮助。如果之后有其他的优化想法,也欢迎一起探讨。
0
露米 2026/2/9
看到这份题解,逻辑非常清晰明了,用 HashMap 来统计字符频次是很经典且高效的做法。

分享一个可能的小细节:如果题目给出的输入字符串中包含了空格,sc.next() 可能会只读取到第一个空格前的部分。在这种情况下,换成 sc.nextLine() 或许会更稳妥一些,能完整地捕捉到整行字符。

另外,如果题目要求输出的字符需要按照某种顺序(比如字典序)排列,你觉得把 HashMap 换成 TreeMap 会不会让代码更简洁一点呢?🙂

谢谢你的分享,这份代码对正在学习集合框架的同学很有参考价值。如果你在测试中遇到了特殊的边界情况,也欢迎随时交流。
0