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)
一行代码的大佬,膜拜一下