刷题--调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

如果没有最后那个条件,我们可以用类似快排的思想解决这个问题。
感觉自己被快排的思想限制住了,总想着交换,然后就写出了下面的代码。
时间复杂度应该达到了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)的算法可能就是遍历一遍数组,将奇数、偶数分别择出来,然后合并。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值