
本文介绍一种高效、安全的方法,通过排序后线性扫描判断整型数组(如骰子结果)中是否包含至少4个严格递增的连续整数,并修正原始代码中的越界与逻辑错误。
本文介绍一种高效、安全的方法,通过排序后线性扫描判断整型数组(如骰子结果)中是否包含至少4个严格递增的连续整数,并修正原始代码中的越界与逻辑错误。
在骰子游戏逻辑中,常需验证5枚骰子结果是否能组成“四连号”(如1-2-3-4-X、2-3-4-5-X或3-4-5-6-X)。核心在于:对数组排序后,检测是否存在长度≥4的严格连续递增子序列(即相邻元素差值恒为1)。
原始代码存在两个关键问题:
- arr[i+1] 在 i == arr.length - 1 时越界;
- arr[i]++ 是自增操作,会篡改原数组且逻辑错误(应为 arr[i] + 1);
- 计数逻辑未重置中断后的连续段,导致误判。
以下是修正后的完整实现:
import java.util.Arrays;
public static boolean hasFourConsecutive(int[] dice) {
if (dice == null || dice.length = 4) {
return true; // 提前终止,提升效率
}
} else if (dice[i + 1] != dice[i]) {
// 遇到重复值(如[1,2,2,3,4])不重置;仅当出现跳跃(如1→3)才重置
streak = 1;
}
// 若 dice[i+1] == dice[i](重复值),streak 保持不变,符合“连续整数”定义(重复不影响序列构建)
}
return false;
}
关键设计说明:
- 边界防护:循环上限设为 dice.length - 1,彻底避免 arr[i+1] 越界;
- 连续判定:严格使用 dice[i+1] == dice[i] + 1,确保数值差为1;
- 重复值处理:相同数字不打断连续计数(如 [2,2,3,4,5] 仍可构成 2-3-4-5),符合骰子场景实际需求;
- 早停优化:一旦 streak ≥ 4 立即返回 true,无需遍历剩余元素;
- 健壮性增强:前置校验空数组或长度不足的情况。
测试用例验证:
System.out.println(hasFourConsecutive(new int[]{1,2,3,4,6})); // true → 1-2-3-4
System.out.println(hasFourConsecutive(new int[]{2,3,4,5,1})); // true → 排序后为[1,2,3,4,5]
System.out.println(hasFourConsecutive(new int[]{1,3,4,5,6})); // true → 3-4-5-6
System.out.println(hasFourConsecutive(new int[]{1,2,4,5,6})); // false → 最长连续段为3(4-5-6)
System.out.println(hasFourConsecutive(new int[]{1,1,2,3,4})); // true → 1-2-3-4(重复1不影响)
此方法时间复杂度为 O(n log n)(主要由排序决定),空间复杂度 O(1)(忽略排序的内部开销),简洁可靠,适用于各类基于整数序列的连续性校验场景。










