请求排查:自定义数组众数出现频次计算函数的错误问题
问题排查与修正
我来帮你找出这个函数的问题所在!你的代码逻辑在处理不同元素切换时的计数重置环节出现了漏洞,导致统计频次错误。
错误原因分析
先看你代码里的核心逻辑块:
else{ if(max>m){ m=max; max=1; } }
这里的问题是:只有当当前计数max大于记录的最大频次m时,才会把max重置为1;如果max不大于m,max会保持原来的数值,不会重置。
拿你提到的输入数组[1,2,3,1,2,3,3,3]来说,排序后是[1,1,2,2,3,3,3,3],我们一步步走错误流程:
- 前两个
1统计后,max=2,m被更新为2,max重置为1; - 接下来两个
2统计后,max=2,此时max不大于m(2=2),所以if(max>m)不执行,max仍然是2,没有被重置; - 后续遇到连续的
3时,max从2开始累加:i=5时max=3,i=6时max=4,i=7时max=5; - 循环结束后,
max=5>m=2,m被更新为5,最终返回错误的5。
修正后的代码
解决方法很简单:不管max是否大于m,只要切换到不同元素,都要把max重置为1(重置前先判断是否要更新m即可)。另外建议加上空数组的边界判断,让函数更健壮:
public static int findMaxFrequency(int[] arr) { if (arr == null || arr.length == 0) { return 0; } Arrays.sort(arr); int currentCount = 1; // 重命名变量,让逻辑更易读 int maxCount = 1; for (int i = 1; i < arr.length; i++) { if (arr[i] == arr[i-1]) { currentCount++; } else { if (currentCount > maxCount) { maxCount = currentCount; } currentCount = 1; // 强制重置为1,不管之前的计数大小 } } // 最后检查最后一组元素的统计结果 if (currentCount > maxCount) { maxCount = currentCount; } return maxCount; }
验证修正效果
用你的测试数组[1,2,3,1,2,3,3,3]测试:
- 排序后处理到两个
2时,currentCount=2,不大于maxCount=2,所以不更新maxCount,但currentCount被重置为1; - 后续连续的
3从currentCount=1开始累加,最终得到currentCount=4; - 循环结束后,
currentCount=4>maxCount=2,maxCount更新为4,返回正确结果。
内容的提问来源于stack exchange,提问作者QUEST275
相关产品推荐
相关产品推荐

