使用Python查詢環形跑道中最常訪問的區域的程式
假設我們有一個數字n和一個名為rounds的陣列。我們有一個環形跑道,它由n個不同的區域組成,編號從1到n。現在考慮在這個跑道上進行一場比賽,比賽包括m個不同的回合。第i回合從rounds[i-1]區域開始,在rounds[i]區域結束。例如,如果第1回合從rounds[0]區域開始,在rounds[1]區域結束。因此,我們必須找到按升序排列的訪問次數最多的區域。(跑道的編號按逆時針方向的區域編號升序排列)
因此,如果輸入類似於n = 4 rounds = [1,3,1,2],則輸出將為[1, 2]
因為比賽從1號區域開始。訪問的區域順序如下:[1,2,3(第一回合結束),4,1(第二回合結束),2(第三回合結束)]。這裡1號和2號區域都被訪問了兩次,它們是訪問次數最多的區域。而3號和4號區域只訪問了一次。
為了解決這個問題,我們將遵循以下步驟:
d := 一個新的對映
對於j從1到n,執行:
d[j] := 0
d[rounds[0]] := 1
對於i從1到rounds的大小-1,執行:
如果rounds[i] > rounds[i-1],則:
對於j從rounds[i-1]+1到rounds[i]+1,執行:
d[j] := d[j] + 1
否則:
對於j從rounds[i-1]+1到n,執行:
d[j] := d[j] + 1
對於j從1到rounds[i],執行:
d[j] := d[j] + 1
curr := d[rounds[0]]
out := [rounds[0]]
對於i從1到n,執行:
如果i與rounds[0]不同,則:
如果d[i] > curr,則:
curr := d[i]
out := [i]
否則,當d[i]與curr相同時,則:
將i新增到out中
排序後返回out
示例(Python)
讓我們來看下面的實現,以便更好地理解:
def solve(n, rounds): d = {} for j in range(1,n+1): d[j] = 0 d[rounds[0]] = 1 for i in range(1, len(rounds)): if rounds[i] > rounds[i-1]: for j in range(rounds[i-1]+1, rounds[i]+1): d[j] += 1 else: for j in range(rounds[i-1]+1,n+1): d[j] += 1 for j in range(1,rounds[i]+1): d[j] += 1 curr = d[rounds[0]] out = [rounds[0]] for i in range(1,n+1): if i != rounds[0]: if d[i] > curr: curr = d[i] out = [i] elif d[i] == curr: out = out + [i] return(sorted(out)) n = 4 rounds = [1,3,1,2] print(solve(n, rounds))
輸入
4, [1,3,1,2]
輸出
[1, 2]