如何修复Java中检查骰子数组连续数方法的数组越界问题?
首先,你的代码存在三个核心问题:
- 数组越界:循环条件
i < arr.length会让i遍历到最后一个索引(4),此时arr[i+1]访问的是数组外的元素,必须把循环条件改为i < arr.length - 1,只遍历到倒数第二个元素。 - 逻辑错误:
arr[i]++是修改数组中的元素值,而不是比较“下一个数是否等于当前数+1”,正确的比较应该是arr[i+1] == arr[i] + 1;同时你没有处理重复数字的情况,比如连续两个相同的骰子数会错误增加计数。 - 计数逻辑缺失:遇到不连续的数字时,没有重置连续计数器,导致错误累计。
下面提供两种经过验证的修正方案,适用于5枚骰子的场景:
方案一:修正原逻辑,逐一遍历判断
这种方案保留你原有的遍历思路,修复所有问题并优化效率:
import java.util.Arrays; public class DiceChecker { public static boolean checkFourConsecutive(int[] dice) { if (dice.length != 5) { return false; // 确保输入是5枚骰子的结果 } Arrays.sort(dice); int consecutiveCount = 1; // 遍历到倒数第二个元素,避免数组越界 for (int i = 0; i < dice.length - 1; i++) { if (dice[i+1] == dice[i]) { // 重复数字,不影响连续计数,直接跳过 continue; } else if (dice[i+1] == dice[i] + 1) { consecutiveCount++; // 一旦连续数达到4,直接返回true,无需继续遍历 if (consecutiveCount >= 4) { return true; } } else { // 遇到不连续数字,重置计数器 consecutiveCount = 1; } } // 检查最后一段连续序列是否达标(比如最后四个骰子连续) return consecutiveCount >= 4; } }
关键说明:
- 先校验数组长度,符合5枚骰子的输入要求
- 排序后遍历,遇到重复数字直接跳过,不干扰连续计数
- 每遇到连续数字就增加计数,达到4时立即返回,提升效率
- 遇到不连续数字时重置计数器,避免错误累计
方案二:利用去重+连续数值判断
这种方案更简洁,核心思路是:先提取骰子中的唯一数字,再检查是否存在4个连续的数值:
import java.util.Arrays; import java.util.stream.IntStream; public class DiceChecker { public static boolean checkFourConsecutive(int[] dice) { if (dice.length != 5) { return false; } // 去重并排序,得到唯一的骰子数值列表 int[] uniqueDice = IntStream.of(dice).distinct().sorted().toArray(); // 如果唯一数字不足4个,直接排除 if (uniqueDice.length < 4) { return false; } // 检查是否存在4个连续的数值 for (int i = 0; i <= uniqueDice.length - 4; i++) { if (uniqueDice[i+3] == uniqueDice[i] + 3) { return true; } } return false; } }
关键说明:
- 去重后如果数字数量少于4,必然无法组成4个连续整数,直接返回false
- 遍历唯一数字列表,只要找到任意一组4个连续的数值(最大数=最小数+3),就返回true
- 这种方法能精准判断是否存在符合要求的连续数字组合,避免重复数字干扰
测试用例验证
| 骰子数组 | 预期结果 | 方案一结果 | 方案二结果 |
|---|---|---|---|
| [1,2,3,4,6] | true | true | true |
| [1,3,4,5,6] | true | true | true |
| [1,2,2,3,5] | false | false | false |
| [2,2,3,4,5] | true | true | true |
| [1,1,1,2,3] | false | false | false |
内容的提问来源于stack exchange,提问作者Sogaria
相关产品推荐
相关产品推荐

