使用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 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告