Leetcode 189 轮转数组
题目描述如下:
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
示例 1:
输入: 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]
[5,6,7,1,2,3,4]
[7,1,2,3,4,5,6]
[6,7,1,2,3,4,5]
[5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100]
分析:拿示例一举例,我们直接对比结果5671234可以很明显的发现若以1为边界可以把数组切割成567和1234两个部分。这里描述一种倒置法,分为三步倒置
STEP1:1234 567
4321 765
STEP2: 4321765
5671234
剩下的就是设计一种倒置方法,参数为数组,开始下标和结尾下标。代码如下所示
public void reverse(int[] nums, int begin, int end){ while(begin < end){ int temp = nums[begin]; nums[begin] = nums[end]; nums[end] = temp; begin++; end--; } }
设计完倒置函数就只剩下三次倒置了,代码如下:
public void rotate(int[] nums, int k) { k = k % nums.length; reverse(nums, 0, nums.length - k - 1); reverse(nums, nums.length - k, nums.length - 1); reverse(nums, 0, nums.length - 1); }
Tips:我们理想的移动次数可以趋近于很多次,但是实际上右移k次与右移k%nums.length次效果一样而且如果不对k做处理那么当k>数组长度时会出现OUT OF BOUNDARY错误。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了