将所有非零值放在数组的右边

时间:2019-03-12 10:02:47

标签: python arrays algorithm

我有一个包含整数的n个元素的固定大小的数组。我想将所有非零值放在数组的右侧。

示例:

[1, 0, 0, 4] => [0, 0, 1, 4]
[2, 0, 4, 3] => [0, 2, 4, 3]
[1, 0, 0] => [0, 0, 1]

执行此操作的简单算法是什么?

这是我目前拥有的,但是它只会将索引处的元素向右移

def slide(arr):

    i = len(arr) - 2
    while i >= 0:

        if arr[i] != 0 and arr[i + 1] == 0:
            arr[i + 1] = arr[i]
            arr[i] = 0

        i -= 1

    print(arr)

3 个答案:

答案 0 :(得分:2)

我会计算零,将其删除并在开始时包含它们:

zeros = [0] * arr.count(0)
while 0 in arr:
    arr.remove(0)
arr = zeros + arr

答案 1 :(得分:2)

要以初始顺序右移值: (就地,线性时间复杂度)

def slide(arr):
    zeros = 0
    for i in range(len(arr) - 1, -1, -1):
        if arr[i] == 0:
            zeros += 1
        else:
            arr[i+zeros] = arr[i]
    for i in range(zeros):
        arr[i] = 0
    print(arr)

slide([1,0,2,0,0,3])

>>[0, 0, 0, 1, 2, 3]

答案 2 :(得分:1)

Create a new array, same size, initialized with 0's.

Scan the first array:
    if the current element is not zero:
        copy it into the second array starting from the end

时间复杂度:O(n) 空间复杂度:O(n)

  

简单直观的方法