题目
给你一个数组,将数组中的元素向右轮转 k
个位置,其中 k
是非负数
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
思路分析
关键点:旋转
把这个数组比喻成一个圆的直径,当我们翻转180°时,令left为最左边,right为正好落在了最后边。当我们再次翻转180°,又会还原成自己。
所以针对这个数组,当我们进行2次翻转,数组里面元素的排列顺序是不会改变的,而元素的位置取决于旋转对称轴。
所以, 这里旋转的本质就是:l 和 r对调,l - 1 和r - 1对调,直到l <= r
于是,我们可以分2步
①把整个数组旋转
翻转前: nums = [1,2,3,4,5,6,7]
翻转后: nums = [7,6,5,4,3,2,1]
②对数组分段旋转, 以k为分界点
a. 对0 ~ k - 1区间的元素进行翻转 [5,6,7,4,3,2,1]
b. 对k ~ numsSize - 1的元素进行翻转 [5,6,7,1,2,3,4]
代码实现
void reserve(int *nums, int l, int r, int k, int numsSize)
{
int tmp;
while (l < r) {
tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
l++;
r--;
}
}
void rotate(int* nums, int numsSize, int k)
{
int left = 0;
int right = numsSize - 3 + 1;
int ret;
if ((nums == NULL) || (numsSize < 1))
return 0;
k = k % numsSize;
// 翻转整个数组
reserve(nums, 0, numsSize - 1, k, numsSize);
// 翻转前k个元素
reserve(nums, 0, k - 1, k, numsSize);
// 翻转剩余元素
reserve(nums, k, numsSize - 1, k, numsSize);
}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有