输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
如果没有最后那个条件,我们可以用类似快排的思想解决这个问题。
感觉自己被快排的思想限制住了,总想着交换,然后就写出了下面的代码。
时间复杂度应该达到了O(N2)。
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
p = 0
even_number = []
while p < len(array):
if array[p] & 1 == 1:
if even_number:
t = p
for i in range(len(even_number) - 1, -1, -1):
array[t] = array[t]^array[even_number[i]]
array[even_number[i]] = array[t]^array[even_number[i]]
array[t] = array[t]^array[even_number[i]]
t = t ^ even_number[i]
even_number[i] = t ^ even_number[i]
t = t ^ even_number[i]
else:
even_number.append(p)
p += 1
return array
下面的代码看起来时间复杂度是O(N),但其实remove的过程就是把后面所有的元素向前移一位。
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
i, p = 0, 0
while i < len(array):
if array[p] & 1 == 0:
array.append(array[p])
array.remove(array[p])
else:
p += 1
i += 1
return array
下面是类似插入排序的思想。
# -*- coding:utf-8 -*-
class Solution:
def reOrderArray(self, array):
# write code here
for i in range(len(array)):
if array[i] & 1 == 1:
temp = array[i]
j = i - 1
while (array[j] & 1 == 0) and j >= 0:
array[j + 1] = array[j]
j -= 1
array[j + 1] = temp
return array
时间复杂度为O(N)的算法可能就是遍历一遍数组,将奇数、偶数分别择出来,然后合并。