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,一个测试用例失败的主要内容,如果未能解决你的问题,请参考以下文章
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