列表索引越界(街机游戏)
Posted
技术标签:
【中文标题】列表索引越界(街机游戏)【英文标题】:List Index out of Bounds (Arcade game) 【发布时间】:2020-09-01 14:03:07 【问题描述】:我最近参加了一次面试,被问到以下问题:
Adam 非常擅长玩街机游戏,以至于他每次玩游戏都会赢。一天,他走在街上时,发现了一家街机商店,玩家每赢一场游戏都会支付真金白银——然而,这家商店每场游戏只会支付一次。商店有一些游戏,他们会为获胜者支付奖金,每个游戏都有自己的完成时间和支付率。亚当为自己的才华赚钱的前景感到兴奋,走进商店却发现商店在 2 小时后(正好 120 分钟)就关门了。知道他不能在那段时间内玩所有的游戏,他决定选择能最大化他的收入的游戏
街机游戏板示例 游戏完成_TIME (以分钟为单位)PAYOUT_RATE
Pac-man 90 400
Mortal Kombat 10 30
Super Tetris 25 100
Pump it Up 10 40
Street Fighter II 90 450
Speed Racer 10 40
一种可接受的解决方案是,即使游戏列表或完成时间或支付率发生变化,它仍能选择最佳收入。
问题: 用 Java/Scala/Python 编写代码,帮助 Adam 挑选最赚钱的游戏序列。
然后,假设您有一个可变的游戏列表及其支付率。挑选最能为您带来收益的游戏的最佳方式是什么?
输入说明: 输入的第一行始终是一个整数,表示在第一行之后要读取的多行。在我们的示例测试用例中,第一行有 6 行,第一行之后有 6 行,每行都有一个游戏、completion_time 和 payout_rate。 在每条数据行中,游戏、completion_time 和 payout_rate 用“,”(逗号)分隔。 游戏板可能会改变,但商店仍然会在 120 分钟后关门。
输入: 6
Pac-man,80,400
Mortal Kombat,10,30
Super Tetris,25,100
Pump it Up,10,40
Street Fighter II,90,450
Speed Racer,10,40
输出说明: 按字母顺序将赢得他最多的游戏名称打印到标准输出中
输出
Mortal Kombat
Pump it Up
Speed Racer
Street Fighter II
到目前为止尝试过:
import sys
import itertools
line = sys.stdin.readline()
def biggest_payout(line):
a = line.split(sep=' ')
b = []
for i in range(1, len(a)):
b.append(a[i].split(sep=','))
c = []
for i in range(len(b)):
c.append(int(b[i][1]))
min_sums = []
for L in range(0, len(c)+1):
for subset in itertools.permutations(c, L):
min_sums.append(sum(subset))
e = []
for i in range(len(b)):
e.append(int(b[i][2]))
money_sums = []
for L in range(0, len(e)+1):
for subset in itertools.permutations(e, L):
money_sums.append(sum(subset))
k = []
for i in range(len(b)):
k.append(b[i][0])
movie_combos = []
for L in range(0, len(k)+1):
for subset in itertools.permutations(k, L):
movie_combos.append(subset)
while True:
if min_sums[money_sums.index(max(money_sums))] > 120:
money_sums[money_sums.index(max(money_sums))] = 0
else:
index = money_sums.index(max(money_sums))
break
return movie_combos[index]
for line in sys.stdin:
print(biggest_payout(line))
错误:
File "/temp/file.py", line 13, in biggest_payout
c.append(int(b[i][1]))
IndexError: list index out of range
我得到数组索引出站,请指导我如何解决这个问题?
【问题讨论】:
请复制错误跟踪,指出“列表索引超出范围”错误发生在哪一行。a = line.split(sep=' ')
假设 line = "Pac-man,80,400"
,所以 a
将是 [Pac-man,80,400]
对吗?
当你的代码从不调用这个函数时,你如何在biggest_payout
中得到一个错误?它只打印除第一行之外的输入。
请立即查看
首先你应该使用 print()
来查看变量中的内容 - print( i, b[i], len(b[i]) )
也许你在 i
中使用了太大的值并且问题会导致 [i]
或者 b[i]
没有有两个值和问题使[1]
- 但如果您不检查变量中的值,您将不会知道。
【参考方案1】:
你不应该用' '
分割行,你的代码还有更多问题。
排列还将包含(Pac-man, Mortal Kombat)
和 (Mortal Kombat, Pac-man)
等。我宁愿使用组合(在这种情况下,组合比排列少10倍)并写下这样的内容。
import sys
import itertools
n = int(sys.stdin.readline())
games =
for i in range(n):
s = sys.stdin.readline().rstrip().split(',')
games[s[0]] = (int(s[1]), int(s[2]))
res = ()
maxpay = 0
for k in range(1, n):
for z in itertools.combinations(games, k):
time = 0
pay = 0
for x in z:
time += games[x][0]
if time > 120:
break
pay += games[x][1]
if time <= 120 and pay > maxpay:
res = z
maxpay = pay
print('\n'.join(sorted(list(res))))
测试。
$cat data
6
Pac-man,80,400
Mortal Kombat,10,30
Super Tetris,25,100
Pump it Up,10,40
Street Fighter II,90,450
Speed Racer,10,40
$python3 solution.py < data
Mortal Kombat
Pump it Up
Speed Racer
Street Fighter II
【讨论】:
以上是关于列表索引越界(街机游戏)的主要内容,如果未能解决你的问题,请参考以下文章