首页 > 代码库 > 【编程之美】2.17 数组循环位移

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

 

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