Kros的博客 Kros的博客
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云

Kros

凡心所向,素履以往,生如逆旅,一苇以航
首页
  • CSS
  • 工具
  • Vue
  • js
  • Vue3
  • 算法
  • 折腾笔记
一言
  • 分类
  • 标签
  • 归档
码云
  • 每日算法

    • 信
    • 独一无二的出现次数
    • 按奇偶排序数组Ⅱ
    • 两数之和
    • 两数相加2
    • 寻找两个正序数组的中位数
    • 二叉树最大深度
    • 洗牌算法
    • 移动零
    • 数组元素排列组合
    • 上升下降字符
    • 最大间距
    • 四数相加2
    • 最大三角周长
    • 在排序数组中查找元素的起始位置
    • 最富有客户的资产总量
    • 打印规定循环字符串
    • 从m个数中选择n个数的组合
    • 复原IP地址
    • 有效的数独
    • 旋转图像
    • 缺失的第一个正整数
    • 第 N 个泰波那契数
    • 轮转数组
    • 爬楼梯
    • 斐波那契数列
    • 使用最小花费爬楼梯
    • 打家劫舍
    • 删除并获得点数
    • 颜色分类
    • 字母异分词分组
    • 加一
    • N叉树的层序遍历
    • N叉树的前序遍历
    • N叉树的后序遍历
    • N叉树的深度
    • 二叉树的中序遍历
    • 和并两个有序数组
    • 移除元素
    • 删除有序数组中的重复项Ⅱ
    • 多数元素
    • 找到数组的中间位置
    • 搜索插入位置
    • 最长连续序列
    • 三数之和
    • 找到字符串中所有字母异位词
    • 有效的括号
    • 最小栈
    • 求出硬币游戏的玩家
    • Find the odd int
    • Regex validate PIN code
    • Find the next perfect square
  • 折腾

  • 分享

  • 随笔
  • 每日算法
kros
2024-05-06

轮转数组

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

举个例子,比如:nums = [1,2,3,4,5] k = 3时,

  • 第一轮 数组从最后一位开始遍历整个数组得到结果[5,1,2,3,4]
  • 第二轮 以上一轮得到的结果再从最后一位开始遍历得到[4,5,1,2,3]
  • 第三轮 步骤与上一步相同得到[3,4,5,1,2]

# 方法一:遍历数组

通过上面的每步变化我们可以看到数组还是原来数据只是数据的起点下标变了,上面的数据可以看成是从下标nums.length - k 到nums.length - k - 1的数据,根据上面的原理我们可以轻易写出下面代码:

var rotate = function(nums, k) {
  // 遍历的起点,超出length的需要取余处理
  let start = k > nums.length ?  nums.length - (k % nums.length) : nums.length - k 
  const cNums = nums.concat()
  for(let i = 0; i < nums.length; i++) {
    // 取余长度避免越界
    nums[i] = cNums[(start + i) % nums.length]
  }
};
1
2
3
4
5
6
7
8
9

# 方法二:出入栈方式

根据第一轮到第三轮的变化规律可以看到,每一步数组先pop数据再把pop出来的数据推到数组首部,形成一个不断循环出栈入栈的过程。

var rotate = function(nums, k) {
  let times = k % nums.length,pArr = []
  for(let i = 0; i < times; i++) {
    pArr.push(nums.pop())
  }
  // unshift时间消耗很大,不要在pop时unshift数据,要在结束后统计处理
  pArr.reverse()
  nums.unshift(...pArr)
}

1
2
3
4
5
6
7
8
9
10

# 方法三:数组拼接

同样,我们可以看到[3,4,5,1,2]与[1,2,3,4,5]的区别在于把尾部的3,4,5拼接到数组的首部,所有我们也可以通过数组的简单拼接实现:

var rotate = function(nums, k) {
  // 遍历的起点 也是剪切拼接的起点
  let start = k > nums.length ?  nums.length - (k % nums.length) : nums.length - k 
  // 剪切尾部
  const sArr = nums.slice(start)
  // 删除尾部
  nums.splice(start, sArr.length)
  // 拼接尾部到首部
  nums.unshift(...sArr)
};

1
2
3
4
5
6
7
8
9
10
11

提示

几种方式

上次更新: 2025/09/05, 8:09:00
第 N 个泰波那契数
爬楼梯

← 第 N 个泰波那契数 爬楼梯→

最近更新
01
Find the next perfect square
09-05
02
Regex validate PIN code
09-05
03
Find the odd int
09-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 kros king
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
icon-heart-o icon-heart icon-infinity icon-pause icon-play link next prev