👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:Leetcode
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注
一、题目描述
链接:轮转数组
二、思路及代码实现
2.1 法一:开辟内存空间
思路:
首先可以开辟一个新的空间,然后将数组后k个元素拷贝到新空间前面,再将原数组前n - k个放入在新空间后面,最后再把新空间中的所有元素拷贝到原数组即可。
【动图展示】
【代码实现】
通可以写出上述代码,但是通过不了。这是为什么呢?通过走读代码就会发现
所以,可以这么想:假设有这么一串数据1、2、3
。当k = numsSize
,相当于没有翻转(无变化)。如果k = 4
,相当于只翻转了一次,如果k = 5,
也就相当于翻转2次。所以可以在开头加上k %= numsSize
即可
【AC代码】
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
//1.开辟新空间
int* tmp = (int*)malloc(sizeof(int) * numsSize);
//2.拷贝后k个
memcpy(tmp,nums + numsSize - k,sizeof(int) * k);
//3.再拷贝原数组n - k到新空间
memcpy(tmp + k,nums,sizeof(int) * (numsSize - k));
//3.最后再拷贝回原数组
memcpy(nums,tmp,sizeof(int) * numsSize);
//养成编写习惯,记得释放掉空间,防止内存泄漏
free(tmp);
}
2.2 法二:双指针
思路
- 先逆序后k个数
- 再逆序numsSize - k个数
- 最后再逆序整个数组
最后由于3次逆序,因此可以写一个函数方便复用
【动画展示】
【代码实现】
void reverse(int* left,int* right)
{
while (left < right)
{
int tmp = *left;
*left = * right;
*right = tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k)
{
k %= numsSize;
//1.逆序后k个数
reverse(nums + numsSize - k,nums + numsSize - 1);
//2.逆序numsSize - k个数
reverse(nums,nums + numsSize - k - 1);
//3.最后逆序整个数组
reverse(nums,nums + numsSize - 1);
}
【AC通过】