当前位置:   article > 正文

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。_数组移动k位

数组移动k位

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

 

你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?                                                           比如:输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]

无脑解法:就硬挪,双重循环,内层循环控制从左到右挪动有几个数挪几次,外层循环控制K挪几个位置。

  1. public void arrayMove1(int[] arr, int k) {
  2. int len = arr.length;
  3. k = k % len;
  4. for (int i = 0; i < k; i++) {
  5. int temp = arr[len - 1];
  6. for (int j = len - 1; j > 0; j--) {
  7. arr[j] = arr[j - 1];
  8. }
  9. arr[0] = temp;
  10. }
  11. System.out.println("数组向后移动K位的结果为:");
  12. System.out.println(Arrays.toString(arr));
  13. }

数组翻转法:

先将数组整体翻转,再以k为界,两侧分别翻转。这个解法很巧妙

比如我们定义一个数组arr={1,2,3,4,5,6,7} ,k=3

为了防止数组下标越界 我们把k处理一下:k=k%len

第一个for循环翻转整个数组

第二个for循环翻转k左边的数组

第三个for循环翻转k右边的数组

  1. public void arrayMove2(int[] arr, int k) {
  2. int len = arr.length;
  3. k = k % len;
  4. int temp=0;
  5. for (int i = 0; i < len / 2; i++) {
  6. temp = arr[len - 1 - i];
  7. arr[len-1-i]=arr[i];
  8. arr[i]=temp;
  9. }
  10. for (int i = 0; i < k/2; i++) {
  11. temp=arr[k-1];
  12. arr[k-1]=arr[i];
  13. arr[i]=temp;
  14. }
  15. for (int i = k,j=len-1; i<j; i++,j--) {
  16. temp=arr[j];
  17. arr[j]=arr[i];
  18. arr[i]=temp;
  19. }
  20. System.out.println("数组向后移动K位的结果为:");
  21. System.out.println(Arrays.toString(arr));
  22. }

重复代码太多了 ,我们用一个方法把核心逻辑代码封装一下:

  1. public void arrayMove3(int[] arr, int k) {
  2. k %= arr.length;
  3. arrayMoveBasic(arr, 0, arr.length - 1);
  4. arrayMoveBasic(arr, 0, k - 1);
  5. arrayMoveBasic(arr, k, arr.length - 1);
  6. }
  7. public void arrayMoveBasic(int[] arr, int i, int j) {
  8. while (i < j) {
  9. int temp = arr[i];
  10. arr[i] = arr[j];
  11. arr[j] = temp;
  12. i += 1;
  13. j -= 1;
  14. }
  15. }

噔噔蹬蹬~ 这样就简洁多了。

欢迎斧正!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/567451
推荐阅读
相关标签
  

闽ICP备14008679号