【编程之美】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;
}

 

posted @ 2014-11-12 22:48  匡子语  阅读(363)  评论(0编辑  收藏  举报