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
相关产品推荐
相关产品推荐

