翻转单枚硬币获取最大邻接值的Java代码错误排查
问题分析与修正
首先,你的代码核心逻辑是对的——先计算原始邻接值,再计算翻转每枚硬币后邻接值的变化量,最后取原始值加上最大变化量得到结果。但问题出在变化量的初始最大值设置错误,导致必须翻转硬币的约束没有被正确遵守。
具体错误点
你初始化r = 0,这意味着当所有硬币翻转后的变化量都是负数时(比如输入[1,1]的情况),Math.max(r, count)会错误地保留0,相当于默认选择“不翻转硬币”,但题目要求必须翻转其中一枚,所以这个初始值是不符合需求的。
输入[1,1]的错误运行过程
- 原始邻接值
result = 1(因为两个硬币相邻且相同)。 - 遍历每枚硬币计算变化量:
- 翻转第0枚硬币:原来的
A[0]和A[1]相等,翻转后不等,变化量count = -1。 - 翻转第1枚硬币:同理,变化量
count = -1。
- 翻转第0枚硬币:原来的
- 由于
r初始为0,Math.max(0, -1)始终返回0,最终计算result + r = 1 + 0 = 1,但正确结果应该是1 + (-1) = 0。
修正方案
把r的初始值改为Integer.MIN_VALUE,这样它会优先取第一个计算出的变化量,之后再更新为最大的变化量,确保我们一定会选择翻转某一枚硬币后的结果,而不是保留原始值。
修正后的代码如下:
public static void main(String[] args) { int[] A = {1, 1}; int n = A.length; int result = 0; for (int i = 0; i < n - 1; i++) { if (A[i] == A[i + 1]) result = result + 1; } // 修正:初始化为极小值,确保会选择翻转后的变化量 int r = Integer.MIN_VALUE; for (int i = 0; i < n; i++) { int count = 0; if (i > 0) { if (A[i - 1] != A[i]) count = count + 1; else count = count - 1; } if (i < n - 1) { if (A[i + 1] != A[i]) count = count + 1; else count = count - 1; } r = Math.max(r, count); } System.out.println(result + r); }
验证修正效果
运行修正后的代码处理[1,1]:
r初始为Integer.MIN_VALUE,第一次比较后变为-1,第二次比较后仍为-1。- 最终结果
1 + (-1) = 0,符合预期。
另外,你的变化量计算逻辑是正确的,其他测试用例(比如题目中的示例输入)也能正常运行。
内容的提问来源于stack exchange,提问作者code ninja
相关产品推荐
相关产品推荐

