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

CodingBat Array-2 zeromax问题求助:代码无法找到最大奇数

解决CodingBat zeroMax问题:修复最大奇数查找逻辑

我来帮你梳理下这个问题!你的思路方向(从右往左遍历)其实是对的,但代码里的几个逻辑漏洞导致没法正确找到右侧的最大奇数。咱们一步步拆解问题,然后修正代码。

问题回顾

任务要求:返回数组的修改版本,每个0被替换为该0右侧的最大奇数;如果0右侧没有奇数,就保留0。
示例:

  • [0, 5, 0, 3] → [5, 5, 3, 3]
  • [0, 4, 0, 3] → [3, 4, 3, 3]
  • [0, 1, 0] → [1, 1, 0]

原代码的问题分析

你的代码里有几个关键逻辑错误:

  1. 循环逻辑混乱:用了i循环但完全没用到i,而是靠val变量递减控制遍历,这种写法很容易导致遍历范围遗漏或重复;
  2. 最大奇数维护不及时:只有当val-2位置是0且val-1是奇数时才更新max,但如果遇到的奇数不在val-1位置,或者左边不是0,就不会更新max,导致后续的0无法获取到正确的最大奇数;
  3. 条件覆盖不全:没有处理“遇到奇数但左边不是0”的情况,这会导致max始终停留在初始的0,无法记录右侧的最大奇数。

修正后的代码

正确的思路应该是:从右往左遍历,全程维护当前遇到的最大奇数,遇到0就用这个最大值替换,遇到奇数就更新最大值,其他元素不做处理。代码如下:

public int[] zeroMax(int[] nums) {
    int maxOdd = 0; // 初始为0,代表还未找到任何奇数
    // 从数组末尾开始向左遍历
    for (int i = nums.length - 1; i >= 0; i--) {
        if (nums[i] % 2 != 0) {
            // 遇到奇数,更新当前最大奇数
            maxOdd = Math.max(maxOdd, nums[i]);
        } else if (nums[i] == 0) {
            // 遇到0,替换为右侧已找到的最大奇数(无奇数则保留0)
            nums[i] = maxOdd;
        }
        // 非0偶数的情况,直接跳过不处理
    }
    return nums;
}

代码验证(对应示例)

咱们用你给的示例测试下:

  1. 示例1 [0,5,0,3]:
    • 遍历到索引3(元素3):是奇数,maxOdd更新为3;
    • 索引2(元素0):替换为3;
    • 索引1(元素5):是奇数,maxOdd更新为5;
    • 索引0(元素0):替换为5;最终结果[5,5,3,3],正确。
  2. 示例2 [0,4,0,3]:
    • 索引3(3):maxOdd=3;
    • 索引2(0):替换为3;
    • 索引1(4):非0偶数,跳过;
    • 索引0(0):替换为3;最终结果[3,4,3,3],正确。
  3. 示例3 [0,1,0]:
    • 索引2(0):此时maxOdd还是0,保留0;
    • 索引1(1):maxOdd=1;
    • 索引0(0):替换为1;最终结果[1,1,0],正确。

内容的提问来源于stack exchange,提问作者john mac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:48:00