使用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]

更新於:2021年5月17日

211 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告