LeetCode 922 按奇偶排序数组II代码异常求助:部分用例偶数位填0
问题诊断与修复
你的代码存在三个核心问题,导致奇数在前的测试用例输出异常:
循环条件逻辑错误
你使用a < nums.length && b < nums.length+1 && c < nums.length+1的逻辑与判断,当处理完所有奇数后,c会超出数组长度(比如测试用例中c最终变为9,而数组长度仅为8),此时循环直接终止,剩余偶数无法填充到对应索引位置,导致这些位置保留初始值0。正确的循环条件只需判断a < nums.length——因为题目保证奇偶元素各占一半,遍历完所有元素后,目标数组的所有位置必然被填满。条件分支未互斥
两个独立的if语句会导致元素被重复判断:处理完偶数后a已自增,接着会执行第二个if判断新的nums[a],不仅逻辑冗余,还可能在a到达数组末尾时触发数组越界异常。应改为else if确保每个元素仅被处理一次。输出逻辑错误
增强for循环for (int i : res)中的i是数组元素值而非索引,你写成System.out.println(res[i])会用元素值作为索引访问数组,导致输出混乱甚至数组越界。正确做法是直接输出i。
修正后的代码
public static void main(String[] args) { int[] nums = {1,3,5,7,2,4,6,8}; int[] res = new int[nums.length]; int current = 0; int evenPos = 0; // 偶数元素的目标索引,从0开始每次加2 int oddPos = 1; // 奇数元素的目标索引,从1开始每次加2 while (current < nums.length) { if (nums[current] % 2 == 0) { res[evenPos] = nums[current]; evenPos += 2; } else { res[oddPos] = nums[current]; oddPos += 2; } current++; // 统一在处理完元素后自增,避免逻辑混乱 } // 正确输出数组所有元素 for (int num : res) { System.out.println(num); } }
修正后的代码对两种测试用例都能输出符合要求的结果,比如测试用例{1,3,5,7,2,4,6,8}的输出为:
2 1 4 3 6 5 8 7
内容的提问来源于stack exchange,提问作者Prateek Goyal
相关产品推荐
相关产品推荐

