旋转数组,链接奉上
目录
- 方法:
- 创建额外的数组:
- 整体思路:
- 代码实现:
- 数组反转:
- 整体思路:
- 代码实现:
- 小插曲:
方法:
创建额外的数组:
整体思路:
创建一个额外的数组,将原数组中的数字根据
k
(即要向右轮转的个数)放到新的数组中,最后将新的数组赋值给原数组
细节:
在放置在数组时,分为两种情况:
例如:
1 2 3 4 5 6 7 原数组
6 7 1 2 3 4 5 轮转后的数组
我们发现:
原数组中的1在新的数组中在第三位,2在第四位…
而6在第一位…
这就说明我们在放置时需要注意不通情况下放置的方法不同
代码实现:
void rotate(int* nums, int numsSize, int k)
{
k = k % numsSize;
int arr[numsSize];
int j = 0;
for(int i = 0; i < numsSize; i++)
{
//判断两种情况
if(i + k <= numsSize - 1)
{
arr[i+k] = nums[i];
}
else
{
arr[j++] = nums[i];
}
}
//赋值到原数组
for(int i = 0; i < numsSize; i++)
{
nums[i] = arr[i];
}
}
数组反转:
整体思路:
-
将字符串
-
1.先整体翻转
2.根据k将前半部分再次翻转
3.将剩下的数组再反转
反转3次
:
例如:假设我们有如下数组,我们轮转2
个
1 2 3 4 5 6 原数组
6 5 4 3 2 1 整体翻转的数组
5 6 1 2 3 4 将6与5翻转,4到1翻转后的结果即为轮转2个的结果
细节:
当我们传参时,知道数组的首尾,就可以将首尾之间的元素进行翻转,
另外,传参时要注意首尾的大小,防止越界等现象发生
代码实现:
void reverse(int* start,int* end)
{
while(end > start)
{
int tmp = *start;
*start = *end;
*end = tmp;
end--;
start++;
}
}
void rotate(int* nums, int numsSize, int k)
{
k = k % numsSize;
reverse(nums, nums + numsSize - 1);
reverse(nums, nums + k -1);
reverse(nums + k, nums + numsSize - 1);
}
小插曲:
当时实现代码时,我考虑到nums+k-1
会出现负数的情况,但是我打算先将整体逻辑敲出来,敲出来之后就直接提交了,没想到的是居然能过,这就让我困惑起来
后来我举例代入,发现当nums+k-1
小于0
时,while
循环不会进入,=0
时也不会进入,无意识敲得代码居然有如此严密的逻辑性(震惊)
欢迎讨论