如何基于现有数组移位代码获取偶数移动位置数组?
问题:获取偶数移动至前端的位移数组
我正在编写一段将数组中所有偶数移至前端、奇数移至后端的代码。
示例输入数组:
int[] a = {1, 3, 2, 5, 4, 7, 8, 6};
期望输出数组:
int[] b = {2, 4, 8, 6, 1, 3, 5, 7};
现在需要程序返回每个偶数移动到目标位置的位移数组成的数组,示例中该数组应为[2, 3, 4, 4],即:
int[] shiftArray = {2, 3, 4, 4};
其中数字2移动了2个位置,数字4移动了3个位置,以此类推。
我目前的代码如下:
int temp = 0; int a = 0; for(int i = 0; i < arr.length; i++){ if(arr[i] % 2 == 0){ for (int j = i; j > a; j--){ temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; } a++; } return arr; }
请问如何基于这段现有代码获取期望的位移数组?
解决方案
你的现有代码通过逐个交换将偶数挪到a指向的目标位置,要计算位移,核心是记录每个偶数初始位置与最终位置的差值。具体修改步骤如下:
- 先统计数组中偶数的数量,提前初始化对应长度的位移数组
shiftArray; - 用一个指针
shiftIndex控制位移数组的填充顺序; - 找到偶数时,直接计算位移值:初始位置
i减去目标位置a(因为往前移动,初始位置和目标位置的差就是移动步数); - 将位移值存入数组后,再执行原有的交换逻辑。
修改后的完整代码:
public static int[] moveEvensAndGetShifts(int[] arr) { int temp = 0; int targetPos = 0; // 统计偶数数量,初始化位移数组 int evenCount = 0; for (int num : arr) { if (num % 2 == 0) { evenCount++; } } int[] shiftArray = new int[evenCount]; int shiftIndex = 0; for (int i = 0; i < arr.length; i++) { if (arr[i] % 2 == 0) { // 计算当前偶数的位移量 shiftArray[shiftIndex++] = i - targetPos; // 执行原交换逻辑,将偶数挪到目标位置 for (int j = i; j > targetPos; j--) { temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; } targetPos++; } } return shiftArray; }
示例验证
输入数组{1,3,2,5,4,7,8,6}时:
- 第一个偶数
2初始位置i=2,目标位置targetPos=0,位移2-0=2; - 第二个偶数
4初始位置i=4,目标位置targetPos=1,位移4-1=3; - 第三个偶数
8初始位置i=6,目标位置targetPos=2,位移6-2=4; - 第四个偶数
6初始位置i=7,目标位置targetPos=3,位移7-3=4;
最终得到的shiftArray就是{2,3,4,4},完全符合需求。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

