Java实现数组奇偶分离代码输出错误,请问哪里出错了如何修正
数组奇偶分离代码错误排查与修正
给定一个整数数组,将数组中的偶数和奇数分离,要求所有偶数排在数组前半部分,奇数排在数组后半部分。
问题复现
示例输入输出
输入: arr[] = 1 9 5 3 2 6 7 11 输出: 2 6 5 3 1 9 7 11 输入: arr[] = 1 3 2 4 7 6 9 10 输出: 2 4 6 10 7 1 9 3
原代码问题诊断
你编写的代码存在两个核心错误:
- 错误1:直接在原数组上覆盖写入,导致原始奇数丢失
第一个循环将偶数依次放到数组前半段时,会直接覆盖数组开头存储的原始奇数,第二个循环遍历已经被修改的数组时,无法找到被覆盖的奇数,最终导致部分位置没有被正确赋值,残留了原数组的旧值。 - 错误2:输出使用
println方法导致每个元素单独换行
你需要的是同行长空格分隔的输出,应该使用print方法代替println。
修正方案
方案1:使用临时数组存储(逻辑简单不易出错)
public class Segregate_even_odd_numbers { public static void main(String[] args) { int a[]= { 1, 3, 2, 4, 7, 6, 9, 10 }; int n = a.length; // 临时数组存储结果,避免覆盖原始数据 int[] res = new int[n]; int ind = 0; // 先放所有偶数 for(int i=0;i<n;i++){ if(a[i]%2==0){ res[ind] = a[i]; ind++; } } // 再放所有奇数 for(int i=0;i<n;i++){ if(a[i]%2!=0){ res[ind] = a[i]; ind++; } } // 输出结果 for(int i=0;i<n;i++){ System.out.print(res[i] + " "); } System.out.println(); } }
方案2:双指针原地交换(无需额外空间,空间复杂度O(1))
如果你需要原地修改数组不使用额外空间,可以用左右双指针的实现:
public class Segregate_even_odd_numbers { public static void main(String[] args) { int a[]= { 1, 3, 2, 4, 7, 6, 9, 10 }; int left = 0, right = a.length - 1; while(left < right) { // 左指针从左向右找奇数 while(left < right && a[left] % 2 == 0) left++; // 右指针从右向左找偶数 while(left < right && a[right] % 2 == 1) right--; // 交换奇偶位置 if(left < right) { int temp = a[left]; a[left] = a[right]; a[right] = temp; } } // 输出 for(int num : a) { System.out.print(num + " "); } System.out.println(); } }
运行结果
两种方案运行后均可得到符合要求的输出:
2 4 6 10 1 3 7 9
注:奇数的相对顺序可以根据需求调整,临时数组方案会保留原始奇偶的出现顺序,双指针方案不会保留奇数的原始顺序。
内容的提问来源于stack exchange,提问作者Ksha
相关产品推荐
相关产品推荐

