189. 轮转数组

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

暴力解法
第一个和最后一个交换
第二个开始和最后一个交换
循环 K 次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
Do not return anything, modify nums in-place instead.
*/
function rotate(nums: number[], k: number): void {
const lastIndex = nums.length - 1;
for(let i = 0; i < k; i++) {
const temp = nums[0];
nums[0] = nums[lastIndex];
nums[lastIndex] = temp;
for(let j = 1; j < nums.length - 1; j++) {
const temp = nums[j];
nums[j] = nums[lastIndex];
nums[lastIndex] = temp;
}
}
};

翻转数组
先翻转整个数组
再翻转 0 到 k -1 数组
再翻转 k-1 到 length - 1 数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const reverse = (nums: number[], start: number, end: number) => {
while(start < end) {
const temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start += 1;
end -= 1;
}
}

/**
Do not return anything, modify nums in-place instead.
*/
function rotate(nums: number[], k: number): void {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.length - 1);
};