Google Foobar Challenge,一个测试用例失败

Posted

技术标签:

【中文标题】Google Foobar Challenge,一个测试用例失败【英文标题】:Google Foobar Challenge, One Test Case Failing 【发布时间】:2020-09-28 04:36:44 【问题描述】:

昨天我有幸受邀参加 Google Foobar 挑战。我正在接受第二个挑战,在处理它的前半小时内,我得到了我认为可行的解决方案。然而,它在一个隐藏的测试用例中失败了,尽管通过我所有的测试它工作正常而且我不知道问题可能是什么。

对于挑战,我要编写一个函数,给定一个列表“l”和一个整数“t”,确定 l 中的第一个连续子列表,其中该子列表中的数字加起来为“t”。该函数输出一个包含该子列表的开始和结束位置的列表。例如,给定列表 [4, 3, 5, 7, 8] 和 int 12,它将找到子列表 [4, 3, 5] 并输出 [0, 2]。如果不存在这样的子列表,则返回 [-1, -1]。

这是我想出的解决方案(使用 Python 2.7):

def solution(l, t):
    for item in l:
        index = l.index(item)
        output = [index]
        total = 0
        while total < t and index < len(l):
            total += l[index]
            index += 1
        if total == t:
            output.append(index - 1)
            return output
    return [-1, -1]

这通过了 5 个测试用例中的 4 个,但我无法说明最后一个用例失败的原因。我已经能够通过严格的测试(大约 3 小时)确定该案例有一个长度为 100 的列表,并且列表中至少包含一个 100,这两个都是基于我给出的标准的最大数量可以输入。这些标准是:

每个列表 l 将包含至少 1 个元素,但不会超过 100 个。 l 的每个元素都在 1 到 100 之间。 t 为正整数,不超过 250。 列表 l 的第一个元素的索引为 0。 对于solution(l, t)返回的列表,起始索引必须等于或小于结束索引。

如果有人能想到该测试用例失败的原因,我将不胜感激。我不知道我是否能够完成整个挑战,但到目前为止我玩得很开心,真的不希望它这么快结束。发布后,我还有 2 天 15 小时来完成它。提前致谢!

【问题讨论】:

【参考方案1】:

我认为这里对lst.index(elem) 的作用存在根本性的误解。它是一种搜索算法,它逐个检查从列表开头到结尾的每个元素,并返回它找到的第一个 elem 实例的索引。因此,如果您有输入 [1, 2, 11, 1, 4, 5] 并且您的目标是 10,那么您将始终获得 0 作为对 l.index(1) 的任何调用的索引。这排除了访问正确答案的[1, 4, 5] 子列表的可能性。

该问题的解决方案是使用enumerate 从可迭代对象中返回(index, element) 对的元组:

for item in l:
    index = l.index(item)

变成

for index, item in enumerate(l):
    # do your thing

除此之外,该算法并不是非常快,并且它不处理负数,但考虑到极其温和的要求,它应该是可以接受的,所以我打赌这个错误足以解决问题。

【讨论】:

以上是关于Google Foobar Challenge,一个测试用例失败的主要内容,如果未能解决你的问题,请参考以下文章

Google Foobar 世界末日燃料挑战指数错误

python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。

python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。

Escape Pods Google Foobar 挑战 |最大流量问题

与兔子一起运行的 Google Foobar Level 4 堆栈溢出

python doomsday_fuel solution.py https://github.com/ivanseed/google-foobar-help/blob/master/challeng