【问题标题】:How many steps to the nearest zero value多少步到最接近的零值
【发布时间】:2021-12-30 04:16:12
【问题描述】:

寻求一些帮助来解决看似简单的算法。

简要概述: 我们有一个未排序的整数列表。目标是找出该列表中的每个元素与最近的“0”值的距离。

如果我们有一个类似这样的列表:[0, 1, 2, 0, 4, 5, 6, 7, 0, 5, 6, 9]

预期结果将是:[0, 1, 1, 0, 1, 2, 2, 1, 0, 1, 2, 3]

我试图简化问题以提出一些简单的算法,但我不知道如何跟踪前一个和下一个零值。 我最初的想法是找出列表中零的所有索引,并用值填补这些零之间的空白,但这显然对我来说不太奏效。

执行不佳的代码(到目前为止,我只是将步骤倒数到下一个零):

def get_empty_lot_index(arr: list) -> list:
    ''' Gets all indices of empty lots '''
    lots = []
    for i in range(len(arr)):
        if arr[i] == 0:
            lots.append(i)
    return lots

def space_to_empty_lots(arr: list) -> list:
    empty_lots = get_empty_lot_index(arr)
    new_arr = []
    start = 0
    for i in empty_lots:
        steps = i - start
        while steps >= 0:
            new_arr.append(steps)
            steps -= 1
        start = i + 1
    return new_arr

【问题讨论】:

    标签: python list algorithm


    【解决方案1】:

    一种可能的算法是对输入列表进行两次扫描:一次向前,一次向后。每次保留最后遇到的0的索引并存储差异。在第二次扫描中,取第一次扫描中存储的最小值和新结果:

    def space_to_empty_lots(arr: list) -> list:
        result = []
        # first sweep
        lastZero = -len(arr)
        for i, value in enumerate(arr):
            if value == 0:
                lastZero = i
            result.append(i - lastZero)
        # second sweep
        lastZero = len(arr)*2
        for i, value in reversed(list(enumerate(arr))):
            if value == 0:
                lastZero = i
            result[i] = min(result[i], lastZero - i)
        return result
    

    注意:此函数假定输入列表中至少有一个 0。不清楚当没有 0 时该函数应该做什么。在这种情况下,此实现将返回一个值大于输入列表长度的列表。

    【讨论】:

    • 可能是错字 - -len(lst) 应该是 len(arr) 吗? 2 扫描仍然是 O(n)。点赞。
    • 谢谢,@Daniel!已更正。
    • 一行前传:result = list(itertools.accumulate(arr, lambda acc,x:(acc+1 if x else 0), initial=len(arr)))[1:]
    • 谢谢@Trincot!这可以正常工作。必须继续练习,因为我从来没有接近过这种解决方案。我可能听起来有点傻,但是我们在第二次扫描中使用 len(arr)*2 实现了什么?
    • len(arr)*2 只是一个足够大的值,当它在minresult[i] 的值“战斗”时应该会丢失。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 2013-04-01
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多