刷题--二分法相关--三步翻转法

直接看例题。

例 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 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 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;
    }
}

 

你可能感兴趣的:(刷题--二分法相关--三步翻转法)