[189] 轮转数组 js

题目描述:给定一个整数数组 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]

解题思路:

  1. 一开始就是比较下标的数字,发现  数字最后要待的数字的下标 = (数字之前的下标 + 要移动的位置个数k) % 数组长度  这个不符合题目的空间复杂度
  2. 这个是答案里提到的轮形替换的方法,利用了一个变量来记录,被替换走的数字的值,替换他的就是要来这个位子的数字,替换了不就丢了,所以需要记录下来,直到再次回到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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值