You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java统计字符串最高频字符的计数器放置位置问题

Java字符频次统计计数器逻辑调整方案

问题核心

实现字符串字符频次统计(找众数)功能时,现有代码可定位最高频字符,但计数器逻辑放置位置错误,无法正确返回最高频字符的出现次数。

原有代码逻辑问题

  • 自定义的counter、steadyCount计数逻辑嵌套在内层遍历循环中,计数触发时机错误,还会被反复重置,计算结果和最终找到的最高频字符无法对应
  • 重复维护计数变量:代码中已经用freq数组存储每个字符的出现频次,不需要额外编写零散的内层计数逻辑
  • 标记位noMode判断位置错误,会把存在众数的场景误判为无众数
  • 没有跳过空格、已统计过的重复字符的无效计数

调整后完整代码

import java.util.*;

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

        System.out.println("Please enter a one line sentence:");
        String words = scnr.nextLine();

        findAlphabetMode(words);
        scnr.close();
    }

    public static void findAlphabetMode(String input){
        // 空输入边界处理
        if (input == null || input.isBlank()) {
            System.out.println("Mode: No Mode");
            return;
        }

        int[] freq = new int[input.length()];
        char mode = input.charAt(0);
        boolean noMode;
        char[] stringArr = input.toCharArray();

        // 第一轮遍历:统计每个非空格、未重复标记字符的出现频次
        for (int i = 0; i < stringArr.length; i++){
            // 跳过空格、已经统计过标记为0的重复字符
            if (stringArr[i] == ' ' || stringArr[i] == 0) {
                freq[i] = 0;
                continue;
            }
            freq[i] = 1;
            for(int j = i + 1; j < stringArr.length; j++){
                if(stringArr[i] == stringArr[j]){
                    freq[i]++;
                    // 标记重复位置的字符为0,避免后续重复统计
                    stringArr[j] = 0;
                }
            }
        }

        // 第二轮遍历:找最高频次和对应字符
        int maxCount = freq[0];
        for(int i = 0; i < freq.length; i++){
            if(maxCount < freq[i]){
                maxCount = freq[i];
                mode = stringArr[i];
            }
        }

        // 最高频次为1说明所有字符仅出现1次,不存在众数
        noMode = maxCount <= 1;

        if (noMode) {
            System.out.println("Mode: No Mode");
        }
        else {
            System.out.println("The letter " + mode + " occurs " + maxCount + " times");
        }
    }
}

关键调整点说明

  • 不需要在内层循环额外编写计数器逻辑:第一轮双重循环执行完成后,freq数组已经存储了每个有效字符的准确出现次数,第二轮遍历找最大值时,maxCount就是最高频字符的准确出现次数,直接用于输出即可
  • 完全移除原有错位放置的counter、steadyCount相关代码:这部分逻辑写在内层j循环中,每次匹配到重复字符就会触发计数、重置,统计的是局部匹配次数,不是全局最高频字符的总出现次数
  • 修正noMode判断逻辑:只有当所有字符出现次数都不超过1时,才判定为无众数,避免误判
  • 补全空输入、空格跳过的边界处理,避免空指针、统计空格的异常问题

内容的提问来源于stack exchange,提问作者nessiewess

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:03:39