首页 > 编程语言 > 详细

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

时间:2014-11-13 00:14:15      阅读:396      评论:0      收藏:0      [点我收藏+]

题目:一个有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 数组循环位移

原文:http://www.cnblogs.com/dplearning/p/4093772.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!