数组的循环右移K位算法,仅使用一个附加的空间,交换次数或元素移动时间复杂度为O(n);
/*步骤分为三步:(K=2)

1.将第 1 位至第 N-K 位进行反转;1,2,3, 4,5->3,2,1, 4,5
2.将第 N-K+1 位至第 N 位进行反转;3,2,1, 4,5->3,2,1, 5,4
3.将整个第 1 位至第 N 位进行反转;3,2,1,5,4->4,5,1,2,3

最终即可实现 循环右移 K 位的算法;*/

void Reverse(int start, int end, int* B)//逆置函数
{
    int i = start, j = end, temp = 0;//附加空间
    while (i < j)
    {
        temp = B[i];
        B[i] = B[j];
        B[j] = temp;
        j--;
        i++;
    }
}
void Exchange(int Num,int k,int* B)//生成函数
{
    k=k%Num;
    Reverse(0, Num - k - 1, B);//注意传参时一维数组下标由0开始
    Reverse(Num-k, Num-1, B);
    Reverse(0, Num - 1, B);
}

WildDuck
0 声望1 粉丝