Moving Zeros To The End(codewar)

题目:

Write an algorithm that takes an array and moves all of the zeros to the end, preserving the order of the other elements.

move_zeros([1, 0, 1, 2, 0, 1, 3]) # returns [1, 1, 2, 1, 3, 0, 0]

 

我的答案1:time 573ms

def move_zeros(array):
    count = []
    new_array = []
    n = array.count(0)
    i = 0
    while i < len(array):
        if array[i] == 0:
            array.pop(i)
            i = i - 1
            count.append(0)
        i = i + 1
    array.extend(count)
    return array

 一开始想把0抛出后用一个列表接收,然后将0的列表添加到抛出0的列表之后,后来发现无论是使用pop还是remove,抛出0后列表的长度会变化,导致使用rangeI(len)方式,pop之后的array[i]元素就不会遍历,这样就会漏掉元素

顺着这个逻辑,那就不使用range,直接用while判断,就可以了

 

 

答案2:time 601ms

def move_zeros(array):
    num_list = []
    zero_list = []
    for a in array:
        if a == 0:
            zero_list.append(a)
        else:
            num_list.append(a)
    return (num_list+zero_list)

 思路一致,但是逻辑更清楚。

遍历array,然后将碰到是0的,拿到zero的列表中,将不为0的,顺序放到num列表中,最后将两个列表合起来。

但是复杂度没有变化。

 

答案3:

def move_zeros(array):
    return sorted(array, key=lambda x: x == 0 and x is not False)

一行代码的大佬,膜拜一下

 



posted @ 2021-04-14 10:47  请叫我德华  阅读(101)  评论(0编辑  收藏  举报