不考慮相對位置
題目描述
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。
分析
使用雙指針
,利用快排
的一次劃分
思想,很快得到答案。
代碼
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
if not array:
return []
length = len(array)
left = 0
right = length-1
while left<right:
while left<right and not self.isEven(array[left]):
left += 1
while left<right and self.isEven(array[right]):
right -= 1
if left<right:
array[left], array[right] = array[right], array[left]
return array
def isEven(self, num):
return num & 1 == 0
考慮相對位置
題目描述
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
分析
- 方法一:利用
python列表
,初始化兩列表最終在合併成所需答案,時間複雜度爲O(n)
,空間複雜度爲O(n)
。 - 方法二:利用上題的交換思想,但是不能是一次
快排劃分
,否則不能保證是相對位置不變,所以利用交換排序的思想,交換的兩數中間的數要與被交換的數相對位置不變
,採用冒泡
的思想。
代碼
- 方法一:
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
if not array:
return []
even = []
odd = []
for i in array:
if i & 1 == 1:
odd.append(i)
else:
even.append(i)
odd.extend(even)
return odd
- 方法二:
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
if not array:
return []
length = len(array)
left = 0
while left < length:
# 尋找左邊第一個偶數
while left < length and not self.isEven(array[left]):
left += 1
right = left+1
# 尋找此偶數後面的第一個奇數奇數
while right < length and self.isEven(array[right]):
right += 1
#按順序排列交換
if left<length and right<length:
temp = array[right]
for i in range(right,left,-1):
array[i] = array[i-1]
array[left] = temp
if left<length and self.isEven(array[left]):
break
return array
def isEven(self, num):
return num & 1 == 0