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

如何基于现有数组移位代码获取偶数移动位置数组?

问题:获取偶数移动至前端的位移数组

我正在编写一段将数组中所有偶数移至前端、奇数移至后端的代码。
示例输入数组:

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指向的目标位置,要计算位移,核心是记录每个偶数初始位置与最终位置的差值。具体修改步骤如下:

  1. 先统计数组中偶数的数量,提前初始化对应长度的位移数组shiftArray;
  2. 用一个指针shiftIndex控制位移数组的填充顺序;
  3. 找到偶数时,直接计算位移值:初始位置i减去目标位置a(因为往前移动,初始位置和目标位置的差就是移动步数);
  4. 将位移值存入数组后,再执行原有的交换逻辑。

修改后的完整代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:10:19