我试图解决一个编程问题数组旋转到右边。
所以给定一个长度数组和一个整数值k,我应该把它向右旋转k次。
我试着理解算法,并提出了以下解决方案:
void reverse(int *nums, int start, int end)
{
while(start<end)
{
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
void rotate(int* nums, int numsSize, int k) {
k = k % numsSize;
if(numsSize > 1)
{
reverse(nums, 0, (numsSize - k - 1));
reverse(nums, numsSize - k, numsSize - 1);
reverse(nums, 0, numsSize - 1);
}
else
*nums = *nums;
}
在上面的解决方案中,我将数组反转3次,使其旋转。第一个反转是0,长度-K,第二个反转是长度-K,长度,第三个是整个数组。
但我的问题是如果我不加上这句话
k = k%numsSize
,我得到一个k>numsize的错误。为什么?
我在youtube上看到了这个链接,但他也没有提到模块操作。
谢谢
最佳答案
当k>numsize意味着numsize-k为负数时,调用带负数的反向函数作为索引,试图在超出范围的地址访问数组*程序崩溃*