Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
轮转数组
题目
给你一个数组,将数组中的元素向右轮转 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]
示例 2:
**输入:**nums = [-1,-100,3,99], k = 2 输出: [3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100]
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
进阶:
- 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
- 你可以使用空间复杂度为
O(1)
的 原地 算法解决这个问题吗?
题目分析
这道题看似比较复杂,其实非常的简单,先将这个数组进行反转,然后从第k个位置开始,第一个数组元素到第k个数组元素进行反转,然后从第k+1个数组元素到最后一个元素进行反转,这样的数组就是我们想要的结果
代码实现
这是代码的实现:
class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length;
reverseNums(nums,0 , nums.length-1);
reverseNums(nums,0,k-1);
reverseNums(nums,k,nums.length-1);
}
public void reverseNums(int[] nums,int start, int end) {
while (start<end) {
//交换
int tempNum = nums[start];
nums[start] = nums[end];
nums[end] = tempNum;
start +=1;
end -=1;
}
}
}
这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉数组的元素进行反转的使用和操作。
这里的反转数组的算法是使用的双指针一个指向头一个指向尾部,然后两两交换,两个指针同时向中间移动,直到两个指针发生碰撞。
总结
我在这里介绍了数组的反转的操作,采用了双指针的思想,理解双指针也很好理解,这道题总体来说难度不大,重要的是理解双指针的思想,双指针是一个指针指向头一个指针指向尾部,然后两两交换,两个指针同时向中间移动,直到两个指针发生碰撞。这样就使用双指针解决了这个问题,双指针的思想很重要,不仅仅是反转数组,在其他题目中我们也可能会用到。
这道题先分析到这里,如果有不当之处,欢迎指正。