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]
原代码的问题分析
你的代码里有几个关键逻辑错误:
- 循环逻辑混乱:用了
i循环但完全没用到i,而是靠val变量递减控制遍历,这种写法很容易导致遍历范围遗漏或重复; - 最大奇数维护不及时:只有当
val-2位置是0且val-1是奇数时才更新max,但如果遇到的奇数不在val-1位置,或者左边不是0,就不会更新max,导致后续的0无法获取到正确的最大奇数; - 条件覆盖不全:没有处理“遇到奇数但左边不是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
[0,5,0,3]:- 遍历到索引3(元素3):是奇数,
maxOdd更新为3; - 索引2(元素0):替换为3;
- 索引1(元素5):是奇数,
maxOdd更新为5; - 索引0(元素0):替换为5;最终结果
[5,5,3,3],正确。
- 遍历到索引3(元素3):是奇数,
- 示例2
[0,4,0,3]:- 索引3(3):
maxOdd=3; - 索引2(0):替换为3;
- 索引1(4):非0偶数,跳过;
- 索引0(0):替换为3;最终结果
[3,4,3,3],正确。
- 索引3(3):
- 示例3
[0,1,0]:- 索引2(0):此时
maxOdd还是0,保留0; - 索引1(1):
maxOdd=1; - 索引0(0):替换为1;最终结果
[1,1,0],正确。
- 索引2(0):此时
内容的提问来源于stack exchange,提问作者john mac
相关产品推荐
相关产品推荐

