给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
输入: [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].
1.第一种方式,最简单,但时间复杂度最高
public void rotate(int[] nums, int k) {
int temp,index=0;
for(int i=0;i<k;i++){
index = nums[nums.length-1];
//每次向右移动一次
for(int j=0;j<nums.length;j++){
temp =nums[j];//记录当前值
nums[j]=index;
index = temp;
}
}
}
2.第二种方式,创建一个新数组,通过取模得到位移之后的数组下标
public void rotate(int[] nums, int k) {
int[] a = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = a[i];
}
}
3.第三种方式,反转数组
假如原数组为 :1,2,3,4,5,6,7,
翻转后为:7,6,5,4,3,2,1,
以k位为区间,第k位数组之前翻转,5,6,7,4,3,2,1,
以k位为区间,第k位数组之后翻转,5,6,7,1,2,3,4
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
}
public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}