刷题--二分法相关--三步翻转法
时间:2020-02-07 11:00:07
收藏:0
阅读:68
直接看例题。
例 lintcode 39. Recover Rotated Sorted Array https://www.lintcode.com/problem/recover-rotated-sorted-array/description
比如[4,5,1,2,3],算法是找到反转点5, 将4 5 翻转成 5 4, 将1 2 3翻转成3 2 1,然后再整体翻转变成1 2 3 4 5。这样的优势在于不会耗费额外空间,而这往往是面试这类翻转问题时要求的。
public void recoverRotatedSortedArray(List<Integer> nums) { if(nums == null || nums.size() == 0){ return; } for(int i = 0;i < nums.size() - 2;i++){ if(nums.get(i) > nums.get(i + 1)){ reverse(0, i, nums); reverse(i + 1, nums.size() - 1, nums); reverse(0, nums.size() - 1, nums); return; } } return; } public void reverse(int start, int end, List<Integer> nums){ while(start < end){ int tmp = nums.get(start); nums.set(start, nums.get(end)); nums.set(end, tmp); start++; end--; } } }
例 lintcode 8 Rotate String https://www.lintcode.com/problem/rotate-string/description
思路相当于上面的题的反过来,这道题是对正序的char数字进行翻转。同样找到反转点,注意翻转次数可能大于长度,而具体的翻转点应该通过一个例子来确定。
public void rotateString(char[] str, int offset) { if(str == null || str.length == 0) return; reverse(str, 0, str.length - offset%str.length - 1); reverse(str, str.length - offset%str.length, str.length - 1); reverse(str, 0, str.length - 1); return; } public void reverse(char[] str, int start, int end){ while(start < end){ char tmp = str[start]; str[start] = str[end]; str[end] = tmp; start ++; end --; } return; } }
原文:https://www.cnblogs.com/2333wzl/p/12271843.html
评论(0)