《编程之美》——数组循环移位

问题:
把一个含有N个元素的数组循环又移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。

分析与解法:
全面地考虑问题,K不一定是小于N的,也有可能远大于N。因为右移K位的结果与右移K-N位的结果相同,所以需要对K进行处理,使K %= N。

假设原数组是abcd1234,循环右移4位后,数组变为1234abcd。可以看出数组的前后两段的顺序是不变的,于是把数组看成两个部分,右移的过程是把数组的两个部分分别逆序,再将整个数组逆序。
《编程之美》——数组循环移位_第1张图片

代码:

void reverse(int arr[], int b, int e)
{
    while(b < e)
    {
        int temp = arr[e];
        arr[e--] = arr[b];
        arr[b++] = temp;
    }
} 

void rightShift(int arr[], int n, int k)
{
    k %= n;
    reverse(arr, 0, n - k - 1);
    reverse(arr, n - k, n - 1);
    reverse(arr, 0, n - 1);
}

你可能感兴趣的:(《编程之美》——数组循环移位)