【问题标题】:Put all non zero values at the right of an array将所有非零值放在数组的右侧
【发布时间】:2019-03-12 10:02:46
【问题描述】:

我有一个包含整数的 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)

【问题讨论】:

  • 您为实现这一目标做了什么尝试?
  • 是否需要保留元素的相对顺序?
  • @Aemyl 我尝试向后循环并检查 array[index + 1] 是否为零。如果是,那么我将 array[index + 1] 分配给 array[index]。然而,使用这种方法,我只在一个索引处移动元素
  • @sebastian 是的,保持元素的顺序非常重要
  • @Aemyl。哎呀,对不起。给你

标签: python arrays algorithm


【解决方案1】:

我会计算零,删除它们并在开头包含它们:

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

【讨论】:

  • 不错的方法!没想到这个谢谢!
  • 当心大列表:)(算法是二次的)
  • @MBo 没错,我并没有考虑太多关于运行时复杂性的问题
  • @Aemyl 作者没有询问有效性,所以所有简单有效的解决方案都很好。
【解决方案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]

【讨论】:

  • 我喜欢这个。聪明!
【解决方案3】:
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)

简单直观的方法

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2021-08-17
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2022-01-28
    相关资源
    最近更新 更多