这个博客就用来记录学习过程中遇到的一些问题吧,菜鸡一枚,欢迎各位大佬指正批评。
题目描述
- 对数组nums进行循环右移k位
思路
先对前面部分进行反转(0,len-k-1),再对后面部分进行反转(len-k,nums.size()-1),最后对整个数组进行反转即可实现逻辑右移k位。1.
遇到的问题
提交编译的时候遇到了数组越界问题:double free or corruption (out): 0x0000000001c77e70 *
检查后发现是没有考虑到k大于数组长度的情况,对代码进行修改后编译通过。
代码
class Solution {
public:
void fanzhuan(vector<int>&nums,int first,int end){
int mid=(first+end)/2;
int key,j=end,i=first;
for(;i<=mid;i++,j--){
key=nums[i];
nums[i]=nums[j];
nums[j]=key;
}
}
void rotate(vector<int>& nums, int k) {
if(nums.size()>0){
while(k>=nums.size()){
k=(k-nums.size())%nums.size();
}
int len=nums.size();
fanzhuan(nums,0,len-k-1);
if(len-k>0&&len-k<len-1)
fanzhuan(nums,len-k,len-1);
fanzhuan(nums,0,len-1);
}
}
};
小小思考
循环右移的过程中,数组的先后顺序并没有改变,因此只是将后k部分移到数组头,即把(len-k,len-1)和(0,len-k-1)两部分进行交换。
设初始坐标为a,反转后的坐标f(a)如下:
f(a)={a+ka+k−lena<=len−k−1a>=len−k
f
(
a
)
=
{
a
+
k
a
<=
l
e
n
−
k
−
1
a
+
k
−
l
e
n
a
>=
l
e
n
−
k
先看当a<=len-k-1时,第一次反转后的坐标为len-1-a-k,第二次反转后的坐标为(len-1)-(len-1-k-a)=a+k,可见算法成立。
a>=len-k的时候同理。