1.代码展示
//初级交换
void Reverse(int* nums, int left, int right) {
while (left < right)
{
int tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k) {
k %= numsSize;
Reverse(nums, 0, numsSize - 1);
Reverse(nums, 0, k - 1);
Reverse(nums, k, numsSize - 1);
}
//按位异或交换
void Reverse(int* nums, int left, int right) {
while (left < right)
{
nums[left] ^= nums[right];
nums[right] ^= nums[left];
nums[left] ^= nums[right];
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k) {
k %= numsSize;
Reverse(nums, 0, numsSize - 1);
Reverse(nums, 0, k - 1);
Reverse(nums, k, numsSize - 1);
}
2.详解思路
轮转数组有一个很巧妙的思路就是将数组分成两个部分
前一部分为首元素到第n-k个元素 ,后一部分就是第n-k+1个元素到最后一个元素
可以先写一个逆置元素的函数Reverse,然后可以先逆置后一部分,在逆置前一部分,最后整体逆置。
当然我们要考虑k>数组元素的情况,比如数组元素有12个,而k为22,则只会轮转22-12=10次
所以我们可以用 k %= numsSize 来将k限制在小于 numsSize 的范围内。