You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

翻转单枚硬币获取最大邻接值的Java代码错误排查

问题分析与修正

首先,你的代码核心逻辑是对的——先计算原始邻接值,再计算翻转每枚硬币后邻接值的变化量,最后取原始值加上最大变化量得到结果。但问题出在变化量的初始最大值设置错误,导致必须翻转硬币的约束没有被正确遵守。

具体错误点

你初始化r = 0,这意味着当所有硬币翻转后的变化量都是负数时(比如输入[1,1]的情况),Math.max(r, count)会错误地保留0,相当于默认选择“不翻转硬币”,但题目要求必须翻转其中一枚,所以这个初始值是不符合需求的。

输入[1,1]的错误运行过程

  1. 原始邻接值result = 1(因为两个硬币相邻且相同)。
  2. 遍历每枚硬币计算变化量:
    • 翻转第0枚硬币:原来的A[0]和A[1]相等,翻转后不等,变化量count = -1。
    • 翻转第1枚硬币:同理,变化量count = -1。
  3. 由于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:08:56