[力扣]189 轮转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

 

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释: 
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]

提示:

1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
 

解法:

 1 package day03;
 2 
 3 import java.util.Arrays;
 4 
 5 public class test {
 6     public static void main(String[] args) {
 7         int[] nums = new int[] {1,2,3,4,5,6,7};
 8         rotate(nums , 3);
 9         for(int i = 0 ; i < nums.length ; i++) {
10             System.out.print(" " + nums[i]);
11         }
12     }
13     public static void rotate(int[] nums, int k) {
14         if(nums.length < 2) return;
15         k %= nums.length;
16         reverse(nums, 0 , nums.length-1);
17         reverse(nums, 0, k-1);
18         reverse(nums, k, nums.length-1);
19     }
20     public static void reverse(int[] nums , int head , int tail) {
21         int temp;
22         while(head < tail) {
23             temp = nums[head];
24             nums[head] = nums[tail];
25             nums[tail] = temp;
26             head++;tail--;
27         }
28     }
29 }

总结:

 

我们可以采用翻转的方式,比如12345经过翻转就变成了54321,这样已经做到了把前面的数字放到后面去,但是还没有完全达到我们的要求,比如,我们只需要把12放在后面去,目标数组就是34512,与54321对比发现我们就只需要在把分界线前后数组再进行翻转一次就可得到目标数组了。所以此题只需要采取三次翻转的方式就可以得到目标数组,首先翻转分界线前后数组,再整体翻转一次即可。此题面试常考,大家可以记一下此方法。

posted @ 2022-01-11 19:32  Nickeyhu  阅读(53)  评论(0编辑  收藏  举报