手摇算法(也叫三次反转算法)
看题:将字符串abcdefg,变成efgabcd,要求空间复杂度O(1)。
解答:
- 第一步:将子串abcd反转,变成dcba。源字符串变成dcbaefg
- 第二步:将字串efg反转,变成gfe。源字符串变成dcbagfe
- 第三步:将整个字符串dcbagfe反转,变成efgabcd。
手摇算法常常被用来旋转字符串。同时,手摇算法也可以用来做原地归并排序,实现空间O(1).
核心代码:
void shiftBlocks(int arr[], int start, int pos, int end) { reverse(arr,start,pos-1); reverse(arr,pos,end); reverse(arr,start,end); } void reverse(int arr[], int start, int end) { for(int i=start, j=end; i<j; i++,j--) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
时间: 2024-11-03 22:21:12