将N个字符的数组,循环右移K位。时间复杂度O(N)

xiaoxiao2021-02-28  65

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

#include<iostream> using namespace std; void _Reserve(int* arr, int begin, int end) { for (int i = 0; i < (end - begin + 1)/2; ++i) { int tmp = arr[begin + i]; arr[begin + i] = arr[end - i]; arr[end - i] = tmp; } } void RightShift(int* arr, int size, int num) { _Reserve(arr, 0, num - 1); //翻转0~num-1区间 _Reserve(arr, num, size - 1); //翻转num~size-1区间 _Reserve(arr, 0, size - 1); //整体翻转 } int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 ,9 }; int size = sizeof(arr) / sizeof(arr[0]); RightShift(arr, size, 4); return 0; }

转载请注明原文地址: https://www.6miu.com/read-43259.html

最新回复(0)