题目描述:给定一个整数数组 nums,将数组中的元素向右轮转 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]
解题思路:
- 一开始就是比较下标的数字,发现 数字最后要待的数字的下标 = (数字之前的下标 + 要移动的位置个数k) % 数组长度 这个不符合题目的空间复杂度
- 这个是答案里提到的轮形替换的方法,利用了一个变量来记录,被替换走的数字的值,替换他的就是要来这个位子的数字,替换了不就丢了,所以需要记录下来,直到再次回到0的位置,就往后走一个,接着轮形替换
解法一:直接求要去的下标然后赋值
function rotate(nums: number[], k: number): void {
let copy = nums.slice();
for (let i = 0; i < nums.length; i++) {
let index = (i + k) % nums.length;
nums[index] = copy[i];
}
」
用时:
// Your runtime beats 52.9 % of typescript submissions
// Your memory usage beats 19.31 % of typescript submissions (53.1 MB)
解法二:轮形替换
function rotate(nums: number[], k: number): void {
// temp是每一次轮转的时候被替换走的数字
let temp = nums[0];
// count 记录已经换过多少数字了
let count = 0;
// index 记录每次跳到的位置的坐标
let index = 0;
// startIndex 记录每一次开始轮转的位置,一旦轮转再次回到开始的位置,从开始的下一个开始轮转
let startIndex = 0;
// 只要还有数字没有被替换掉就进循环
while (count < nums.length) {
// 计算下一个要替换的数字的坐标
index = (index + k) % nums.length;
// 交换这个坐标上的数字和上一次被替换走的数字(也就是原本要来这个位置的数字)
[nums[index], temp] = [temp, nums[index]];
// 记录已经被换过的数字的个数+1
count++;
// 判断如果回到了起点的位置,就让起点+1,再开启一轮替换
if (index === startIndex) {
startIndex++;
index = startIndex;
temp = nums[index];
}
}
}
用时:
// Your runtime beats 63.32 % of typescript submissions
// Your memory usage beats 31.66 % of typescript submissions (52.7 MB)