假设原数组序列为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); }
浙公网安备 33010602011771号