列表索引越界(街机游戏)

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

【讨论】:

以上是关于列表索引越界(街机游戏)的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫 索引越界

通过 Pandas 将 Excel 字段导入 Python 时遇到问题 - 索引越界错误

游戏图片越界

在 2D Lua 表中查看越界

如何测试索引越界错误? [复制]

TypeConverter 实现的索引越界错误