leecode轮转数组
// 解法一,将最后一个数字存在临时变量temp中,将数组中的值全部后移一位
class Solution {
public void rotate(int[] nums, int k) {
int temp;
for(int j = 1 ;j<=k;j++){
temp = nums[nums.length - 1];
for(int i = nums.length - 1;i > 0; i--){
nums[i] = nums[i-1];
}
nums[0] =temp;
}
}
}
将数组向后移动一位的写法,如果从0开始会使前面的值被覆盖掉。
for(int i = nums.length - 1;i > 0; i--){
nums[i] = nums[i-1];
}
nums[0] =temp;
解法二:引入新的数组,进行映射
注意向右移动n位 对应的映射方法 nums[(i+k) % length] = newArr[i]
class Solution {
public void rotate(int[] nums, int k) {
int[] newArr = new int[nums.length];
for(int i = 0;i < nums.length;i++){
newArr[i] = nums[i];
}
for(int i = 0;i < nums.length;i++){
nums[(i+k)%nums.length] = newArr[i];
}
}
}
解法三:反转数组,先将全部全部数组反转,然后反转前k个,再反转后k个
不要使用for循环:在传入y时,y/2会出现强转现象。
class Solution {
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 x,int y){
int temp = 0;
while ( x < y){
temp = nums[y];
nums[y] = nums[x];
nums[x] = temp;
x++;
y--;
}
}
}
浙公网安备 33010602011771号