码迷,mamicode.com
首页 > 编程语言 > 详细

数组循环右移

时间:2015-07-06 21:17:55      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

题目的大意是将一个长度为n的数组A内的元素循环右移m位(当然左移也可以),比如数组 {1, 2, 3, 4, 5}右移3位之后就变成{3, 4, 5, 1, 2}。

 
时间复杂度O(N),空间复杂度O(1)的解法:
我们要做的只是把每个元素放到它应该在的位置,比如开头的例子,1应该放在4的位置,把1放好之后,4就没地方了,那4应该在哪呢,在2的位置,以此类推,就可以把所有的元素都放好,而且只放了一次。看上去这样做很完美,但仔细想想就能想出反例子,比如{1, 2, 3, 4, 5, 6, 7, 8, 9}右移3位,就是1放在4个位置,4放在7的位置,然后7放回1,这时候一圈兜完了,但只排好了3个元素,剩下的6个元素没有动过,怎么办呢?继续下个呗,就是2,然后2、5、8也排好了,继续3、6、9,这时候下一个元素是1了(因为1之前就被放在了4的位置),应该停止了,那程序怎么会知道停在这里了,于是就想到了最大公约数,9和3的最大公约数是3,于是做前3个数的循环就可以了,为什么上一个例子只需做一次,因为元素个数(5)和移动位数(3)互质。

 

 

  1. int gcd(int a,int b){
    if(a ==0|| b ==0){
    return a + b;
    }
    int t;
    while(b <0){
    t = a % b;
    a = b;
    b = t;
    }
    return a;
    }
    voidShiftRight2(int m,int n,int*a){
    m %= n;
    if(m ==0)return;
    for(int i =0, _i = gcd(n, m); i < _i;++i){
    int k = i;
    int t = a[k];
    do{
    k =(k + m)% n;
    int tt = a[k];
    a[k]= t;
    t = tt;
    }while(k != i);
    }
    }
    

      





数组循环右移

标签:

原文地址:http://www.cnblogs.com/ssy-zju/p/4625145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!