《剑指offer》【调整数组顺序使奇数位于偶数前面】(python版)

题目描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分

思路:
我认真看了一下,题目应该是要求在原地调整,所以这里不能再开辟一个数组
第一种:从头往尾扫描数组,遇到一个偶数就把它提出来,依次把其后的数字前移一格,最后将偶数插入末尾的空位。时间复杂度为 O(n2) O ( n 2 )
第二种:采用两指针分别从首尾出发,当头指针遇到一个偶数,并且尾指针遇到一个奇数时,交换两指针的数字,直到两指针相遇。时间复杂度为 O(n) O ( n ) ,(类似于快排)
实现代码:

    def reOrderArray(self, array):
        n = len(array)
        head = 0
        tail = n - 1
        while head < tail:
            while array[head]%2 != 0:
                head += 1
            while array[tail]%2 == 0:
                tail -= 1
            array[head], array[tail] = array[tail], array[head]
            head += 1
            tail -= 1

牛客网附加条件:
保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路:
由于要求相对位置不变,所以以上两种方法不能使用了。我看了一下网络上对于附加条件的解决方案,没有太好的办法,一类是采用稳定的排序,例如冒泡,归并,二是开辟长度为n的数组,遍历原数组,依次把奇数偶数放入新数组,最后将新数组赋值给原数组。时间空间复杂度都没有优化,这里就不在实现了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值