我试图解决一个编程问题数组旋转到右边。
所以给定一个长度数组和一个整数值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为负数时,调用带负数的反向函数作为索引,试图在超出范围的地址访问数组*程序崩溃*

10-08 06:41