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

Java数组多次移位实现:仅支持单次移位的函数优化求解

原代码问题分析

你写的代码无法实现多次移位,核心原因是每次内层循环的移位操作都是基于最原始的array1计算,多次循环只会不断用新的单次移位结果覆盖array2,不会叠加移位效果。除此之外建议先对移位次数做取模处理,避免移位次数大于数组长度时的无效循环。

方案1:最小改动原有逻辑

只要在每次移位后把array2的结果同步到临时数组,供下一次移位使用即可:

public static int[] shiftmultiple(int[] array1, int shiftCount) {
    int len = array1.length;
    // 处理移位次数为负数、大于数组长度的异常情况,得到有效移位次数
    shiftCount = (shiftCount % len + len) % len;
    // 移位次数为0直接返回原数组的拷贝
    if (shiftCount == 0) {
        return array1.clone();
    }
    // 临时数组存储每次移位后的结果
    int[] current = array1.clone();
    int[] array2 = new int[len];
    
    for(int i = 0; i < shiftCount; i++){
        for(int j = 0; j < len-1; j++){
            array2[j+1] = current[j];
        }
        array2[0] = current[len-1];
        // 同步本次移位结果到current,准备下一次移位
        current = array2.clone();
    }
    
    return array2;
}

方案2:更高效的实现(推荐)

不需要嵌套循环做多次移位,直接通过下标映射一次性计算新数组每个位置的取值,时间复杂度稳定为O(n),性能远高于多次循环移位的方案:

public static int[] shiftmultiple(int[] array1, int shiftCount) {
    int len = array1.length;
    int[] array2 = new int[len];
    // 计算有效移位次数
    shiftCount = (shiftCount % len + len) % len;
    for (int i = 0; i < len; i++) {
        // 计算新数组下标i对应原数组的下标
        int originIndex = (i - shiftCount + len) % len;
        array2[i] = array1[originIndex];
    }
    return array2;
}

以上两个方案都满足返回新创建数组的要求,不会修改传入的原始数组。

内容的提问来源于stack exchange,提问作者trix junie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:57:00