旋转数组,链接奉上
目录
- 方法:
- 创建额外的数组:
- 整体思路:
- 代码实现:
- 数组反转:
- 整体思路:
- 代码实现:
- 小插曲:
方法:
创建额外的数组:
整体思路:
创建一个额外的数组,将原数组中的数字根据
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
时也不会进入,无意识敲得代码居然有如此严密的逻辑性(震惊)
欢迎讨论