【编程之美】2.17 数组循环位移

题目:一个有N个元素的数组 循环右移k位 要求时间复杂度O(N)  只允许两个附加变量

abcd1234 循环右移4位  变成 1234abcd

 

做过 思路  (ATBT)T = BA

注意,K可能比N大,K也可能是负数(左移),要注意取余处理!!

#include <stdio.h>

#include <string.h>





void exchange(char * c, int begin, int end)

{

    char tmp;

    for(; begin < end; begin++, end--)

    {

        tmp = c[begin];

        c[begin] = c[end];

        c[end] = tmp;

    }

}



int mod(int r, int c)

{

    if(r >= 0)

    {

        return r % c;

    }

    else

    {

        return c + r % c; //这里 r%c 可以得到一个绝对值小于c的负数 再加上c 得到正数

    }

}

void rightRotate(char * c, int clen, int k)

{

    printf("%s\n", c);

    k = mod(k, clen);  //注意这里 防止k是负数 或k大于clen !!!!!! 考虑全面很重要

    exchange(c, 0, clen - k - 1);

    exchange(c, clen - k, clen - 1);

    exchange(c, 0, clen - 1);

    printf("%s\n", c);

}



int main()

{

    char c[20] = "hello, every one!" ;

    rightRotate(c, strlen(c), -6);



    return 0;

}

 

你可能感兴趣的:(编程之美)