如何将数组元素向左移位3位?Java循环移位功能实现问询
实现Java数组左循环移位功能
没问题,我来帮你搞定这个数组左循环移位的功能!针对你的需求,我给你两种常用的实现方案,还会指出你现有代码里的小细节问题。
方案一:创建新数组(直观易理解)
这种方法通过创建新数组,把原数组的元素按移位规则重新排列,逻辑简单清晰,适合入门理解:
public static double[] rotate(double[] arr, int k) { // 处理边界情况:数组为空/长度为1,或移位位数≤0,直接返回原数组 if (arr == null || arr.length <= 1 || k <= 0) { return arr; } int n = arr.length; // 处理移位位数大于数组长度的情况,取模减少不必要的移位次数 k = k % n; double[] result = new double[n]; // 把原数组从第k位开始的元素复制到新数组开头 System.arraycopy(arr, k, result, 0, n - k); // 把原数组前k个元素复制到新数组末尾 System.arraycopy(arr, 0, result, n - k, k); return result; }
思路说明
- 用
System.arraycopy做元素复制比手动循环效率更高,这是Java提供的原生高效复制方法 - 先处理边界情况,避免无意义的计算(比如移位0位或者数组长度为1时,不需要任何操作)
- 当移位位数
k大于数组长度时,取模k % n,比如数组长度9,移位12位其实等价于移位3位
方案二:原地反转法(空间更高效)
如果想要节省内存(不需要额外创建数组),可以使用三次反转法,空间复杂度为O(1),适合处理大数组:
public static double[] rotate(double[] arr, int k) { if (arr == null || arr.length <= 1 || k <= 0) { return arr; } int n = arr.length; k = k % n; // 1. 反转前k个元素 reverse(arr, 0, k - 1); // 2. 反转后面n-k个元素 reverse(arr, k, n - 1); // 3. 反转整个数组 reverse(arr, 0, n - 1); return arr; } // 辅助方法:反转数组中[start, end]区间的元素 private static void reverse(double[] arr, int start, int end) { while (start < end) { // 交换首尾元素 double temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; start++; end--; } }
思路说明
左循环移位k位的本质可以通过三次反转实现:
比如原数组[38,44,15,11,27,19,8,12,10],移位3位:
- 反转前3个元素:
[15,44,38,11,27,19,8,12,10] - 反转后面6个元素:
[15,44,38,10,12,8,19,27,11] - 反转整个数组:
[11,27,19,8,12,10,15,44,38],这就是左移3位后的结果
注意你的现有代码小问题
你原代码中打印移位后数组的循环条件是i < x.length-3,这会导致最后3个元素(也就是原来的前3个元素)无法被打印,应该改成i < x.length才能看到完整的移位结果:
System.out.println("After rotation: =============================="); for (int i = 0; i < x.length; i++) { // 这里去掉-3 System.out.println("x[" + i + "]: " + x[i]); }
内容的提问来源于stack exchange,提问作者user11036260
相关产品推荐
相关产品推荐

