赞
踩
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? 比如:输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
无脑解法:就硬挪,双重循环,内层循环控制从左到右挪动有几个数挪几次,外层循环控制K挪几个位置。
- public void arrayMove1(int[] arr, int k) {
- int len = arr.length;
- k = k % len;
- for (int i = 0; i < k; i++) {
- int temp = arr[len - 1];
- for (int j = len - 1; j > 0; j--) {
- arr[j] = arr[j - 1];
- }
- arr[0] = temp;
- }
- System.out.println("数组向后移动K位的结果为:");
- System.out.println(Arrays.toString(arr));
- }
数组翻转法:
先将数组整体翻转,再以k为界,两侧分别翻转。这个解法很巧妙
比如我们定义一个数组arr={1,2,3,4,5,6,7} ,k=3
为了防止数组下标越界 我们把k处理一下:k=k%len
第一个for循环翻转整个数组
第二个for循环翻转k左边的数组
第三个for循环翻转k右边的数组
- public void arrayMove2(int[] arr, int k) {
- int len = arr.length;
- k = k % len;
- int temp=0;
- for (int i = 0; i < len / 2; i++) {
- temp = arr[len - 1 - i];
- arr[len-1-i]=arr[i];
- arr[i]=temp;
- }
- for (int i = 0; i < k/2; i++) {
- temp=arr[k-1];
- arr[k-1]=arr[i];
- arr[i]=temp;
- }
- for (int i = k,j=len-1; i<j; i++,j--) {
- temp=arr[j];
- arr[j]=arr[i];
- arr[i]=temp;
- }
- System.out.println("数组向后移动K位的结果为:");
- System.out.println(Arrays.toString(arr));
- }
重复代码太多了 ,我们用一个方法把核心逻辑代码封装一下:
- public void arrayMove3(int[] arr, int k) {
- k %= arr.length;
- arrayMoveBasic(arr, 0, arr.length - 1);
- arrayMoveBasic(arr, 0, k - 1);
- arrayMoveBasic(arr, k, arr.length - 1);
- }
-
- public void arrayMoveBasic(int[] arr, int i, int j) {
- while (i < j) {
- int temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- i += 1;
- j -= 1;
- }
- }
噔噔蹬蹬~ 这样就简洁多了。
欢迎斧正!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。