剑指offer 13. 调整数组顺序使奇数位于偶数前面

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

http://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593

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


思路
思路1:开辟新的数组,遍历原数组将奇数偶数分别放在新的空间里,最后合并。时间复杂度O(n),开辟了额外的数组空间,空间复杂度O(n)。
思路2:用while来遍历,遇到偶数删除这个偶数,并将其向数组的末尾插入。时间复杂度O(n),没有开辟额外的数组空间,空间复杂度O(1)。勘误:实际上pop(index)的时间复杂度是O(n),删除元素时后面的元素往前移动,总的时间复杂度接近O(n^2)


代码实现
思路1:暴力解

class Solution:
    def reOrderArray(self, array):
        # write code here
        # 暴力解,时间复杂度O(n),开辟了额外的数组空间
        odd = []
        even = []
        for i in array:
            if i%2 == 1:
                odd.append(i)
            else:
                even.append(i)
        array = odd + even
        return array

思路2:将偶数尾插入数组

# -*- coding:utf-8 -*-
class Solution:
    def reOrderArray(self, array):
        # write code here
        # 没有额外的数组空间。
        # 实际上pop(index)的时间复杂度是O(n),删除元素时后面的元素往前移动,总的时间复杂度接近O(n^2)
        lenth = len(array)
        move = 0
        index = 0
        while(lenth - move - index > 0):
            if array[index]%2 == 0:
                temp = array.pop(index)
                array.append(temp)
                move += 1
                index -= 1
            index += 1
        return array

能力有限,欢迎各位大佬批评指点,交流是进步的阶梯。

全部评论
尾部插入感觉并不是o(n),python我不太了解。Java题目给的是数组,C++给的是Vector,他俩底层都是数组。所以从中间删除的时候,后面的元素要往前移动。这个也是要耗费时间的,如果数字比较靠前,移动就要O(n),总的复杂度就接近On的平方了。 当然python这个我不了解,如果底层是链式的那就没问题的。
点赞 回复 分享
发布于 2019-09-15 17:09
你好,你直接将删除的偶数插入到尾部,那得到的偶数的相对位置变化了呀。
点赞 回复 分享
发布于 2019-09-27 15:49

相关推荐

10-30 22:18
已编辑
毛坦厂中学 C++
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
3 收藏 评论
分享
牛客网
牛客企业服务