簡體   English   中英

多少步到最接近的零值

[英]How many steps to the nearest zero value

尋求解決看似簡單的算法的幫助。

簡要概述:我們有一個未排序的整數列表。 目標是找出此列表中的每個元素與最近的“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

一種可能的算法是對輸入列表進行兩次掃描:一次向前,一次向后。 每次保留最后遇到的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

注意:這個 function 假設輸入列表中至少有一個 0。 目前尚不清楚當沒有 0 時 function 應該做什么。在這種情況下,此實現將返回一個值大於輸入列表長度的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM