不考虑相对位置
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
分析
使用双指针
,利用快排
的一次划分
思想,很快得到答案。
代码
# -*- 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