1. 程式人生 > >[劍指Offer] 21_調整陣列順序使奇數位於偶數前面

[劍指Offer] 21_調整陣列順序使奇數位於偶數前面

題目

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有奇數位於陣列的前半部分,所有偶數位於陣列的後半部分。

例:

輸入:[1, 3, 4, 65, 7, 12, 4, 6, 8, 11]
輸出:[1, 3, 11, 65, 7, 12, 4, 6, 8, 4]


思路

  1. 注意到題目不要求前半部分和後半部分內部的順序,只需要做區分。因此只要交換前後不滿足的元素即可。
    雙指標遍歷陣列,頭指標遇到偶數時,判斷尾指標是否為奇,為奇數則交換,為偶數則尾指標向前。兩指標相遇則遍歷結束。作者提到用一個函式來表示判斷的依據,以增強擴充套件性和可維護性。在Python中函式也是物件,將判斷函式,傳入修改順序函式即可。這樣完成了交換順序和判斷兩個操作的解耦。
    1. 時間複雜度:O(n)
    2. 空間複雜度:O(1)

程式碼

思路1:時間複雜度:O(n),空間複雜度:O(1)

def reorder_array(nums, key):
    """
    :param nums:array
    :param key: criterion function True in front False at back
    :return: ordered array
    """
    head = 0
    end = len(nums) - 1
    while head < end:
        if key(nums[
head]): head += 1 else: if key(nums[end]): nums[head], nums[end] = nums[end], nums[head] head += 1 end -= 1 else: end -= 1 return nums def is_odd(n): return n % 2 nums = [1,3,4,65,7
,12,4,6,8,11] reorder_array(nums, is_odd)

思考

LeetCode上有不少雙指標的題目,所以遇到這道題的時候很顯然。但是書上提到的可擴充套件是我沒完全想到的,我想到可以將判斷寫成單獨的函式,但沒想到從外部傳入解耦。事實上,只在函式內部寫成子函式,只能做到清晰閱讀。附上一道類似的題目。

LeetCode 26. 刪除排序陣列中的重複項

題目

給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。

示例 1:

給定陣列 nums = [1,1,2],

函式應該返回新的長度 2, 並且原陣列 nums 的前兩個元素被修改為 1, 2。

你不需要考慮陣列中超出新長度後面的元素。

示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],

函式應該返回新的長度 5, 並且原陣列 nums 的前五個元素被修改為 0, 1, 2, 3, 4。

你不需要考慮陣列中超出新長度後面的元素。

說明:

為什麼返回數值是整數,但輸出的答案是陣列呢?

請注意,輸入陣列是以“引用”方式傳遞的,這意味著在函式裡修改輸入陣列對於呼叫者是可見的。

你可以想象內部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對實參做任何拷貝
int len = removeDuplicates(nums);

// 在函式裡修改輸入陣列對於呼叫者是可見的。
// 根據你的函式返回的長度, 它會打印出陣列中該長度範圍內的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}

程式碼

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """ 
        if nums:
            l = len(nums)
        else:
            return 0
        j = 0
        for i in range(1,l):
            if nums[j] == nums[i]:
                pass
            else:
                j += 1
                nums[j] = nums[i]                
        return j+1