您的位置:首页 > 编程语言

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

2014-11-12 22:48 141 查看
题目:一个有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: