給定一個長度爲n的數組,請將數組中元素按照奇偶性重新劃分,所有奇數靠左邊,所有偶數靠右邊,然後分別對奇數、偶數部分進行排序
請儘可能實現通過一次遍歷並且原地操作(即不得藉助其他數組)進行奇偶劃分。
Input
輸入有兩行,第一行輸入一個數字n表示數組的長度,第二行依次輸入n個數字,表示數組的元素值。
Output
打印按照奇偶排列並各自排序後的新數組,元素之間用空格隔開
思路:
思路: 先進行奇偶劃分然後再排序
雙指針遍歷,一個從數組頭部進行,一個從尾部運行;
對於兩個指針指的數字進行判斷,將會有四種情況:
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))))
歡迎評論給出新的好方法.