奇偶數(leetcode)

 給定一個長度爲n的數組,請將數組中元素按照奇偶性重新劃分,所有奇數靠左邊,所有偶數靠右邊,然後分別對奇數、偶數部分進行排序
請儘可能實現通過一次遍歷並且原地操作(即不得藉助其他數組)進行奇偶劃分。

Input
輸入有兩行,第一行輸入一個數字n表示數組的長度,第二行依次輸入n個數字,表示數組的元素值。
Output
打印按照奇偶排列並各自排序後的新數組,元素之間用空格隔開

類似leetcode原題


思路:
思路: 先進行奇偶劃分然後再排序
雙指針遍歷,一個從數組頭部進行,一個從尾部運行;
對於兩個指針指的數字進行判斷,將會有四種情況:
1. 左偶右奇 不作處理,兩個指針分別移動一個單位
2. 左奇右偶 進行交換,兩個指針分別移動一個單位
3. 都是奇數 將尾部指針移動一個單位,再進行上述判斷
4. 都是偶數 將頭部指針移動一個單位,再進行上述判斷

leetcode原題答案

class Solution:
    def sortArrayByParity(self, A: List[int]) -> List[int]:
        i = 0
        j = len(A) - 1
        while i < j:
            # 左偶右奇
            if A[i] % 2 == 0 and A[j] % 2 != 0:
                i += 1
                j -= 1
            # 左奇右偶
            elif A[i] % 2 != 0 and A[j] % 2 == 0:
                A[i], A[j] = A[j], A[i]
                i += 1
                j -= 1
            # 都是奇數
            elif A[i] % 2 != 0 and A[j] % 2 != 0:
                j -= 1
            # 都是偶數
            else:
                i += 1
        return A

本題答案

注意這道題要求是奇數在左邊,偶數在右邊,因此在雙指針遍歷時候要適當調整策略

import sys


def split_even_odd():
    length = int(sys.stdin.readline())
    l = sys.stdin.readline().strip().split(' ')
    i = 0
    j = len(l) - 1
    index = 0
    while i < j:
        # 左偶右奇
        if int(l[i]) % 2 == 0 and int(l[j]) % 2 != 0:
            l[i], l[j] = l[j], l[i]
            index = i
            i += 1
            j -= 1
        # 左奇右偶
        elif int(l[i]) % 2 != 0 and int(l[j]) % 2 == 0:
            index = i
            i += 1
            j -= 1
        # 都是奇數
        elif int(l[i]) % 2 != 0 and int(l[j]) % 2 != 0:
            i += 1
        # 都是偶數
        else:
            j -= 1
    print(' '.join(sorted(l[:index+1], key=lambda x: int(x)) + sorted(l[index+1:], key=lambda x: int(x))))


split_even_odd()

注意以上index表示指向劃分好的數組中最後一個偶數, 以便我們分別排序


暴力方法

length = int(input())
l = input().strip().split(' ')
print(' '.join(sorted([i for i in l if int(i) % 2 != 0], key=lambda x: int(x)) + sorted([i for i in l if int(i) % 2 == 0], key=lambda x: int(x))))

歡迎評論給出新的好方法.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章