一直做梦的猫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成:

1.   逆序排列abcd:abcd1234 → dcba1234; 2.   逆序排列1234:dcba1234 → dcba4321; 3.   全部逆序:dcba4321 → 1234abcd。

void reverse(char arr[], int left, int right) {
    for(int i = left, j = right; i < j; i++, j--) {
        char temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

void rightShift(char arr[], int length, int k) {
    k %= length;
    if(k == 0) return;
    reverse(arr, 0, length - k - 1);
    reverse(arr, length - k, length - 1);
    reverse(arr, 0, length - 1);
}

void leftShift(char arr[], int length, int k) {
    k %= length;
    if(k == 0) return;
    reverse(arr, 0, k - 1);
    reverse(arr, k, length - 1);
    reverse(arr, 0, length - 1);
}

 

posted on 2013-05-13 18:10  一直做梦的猫  阅读(332)  评论(0)    收藏  举报