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
相关产品推荐
相关产品推荐

