我正在尝试完成名为“number_station_coded_messages”的google foo.bar 2级挑战。这是问题所在:
给定正整数l和目标正整数t的非空列表,写一个函数answer(l,t),验证列表l中是否存在至少一个连续的正整数序列(即连续的)子列表)可以求和给定的目标正整数t(键)并返回按字典顺序排列的最小列表,其中包含可以找到此序列的最小起始和结束索引,或返回数组[-1,-1 ]如果没有这样的序列(抛弃Lambda的间谍,并非所有号码广播都包含编码信息)。
例如,如果广播列表l为[4,3,5,7,8]并且密钥t为12,则函数answer(l,t)将返回列表[0,2],因为列表l包含从索引0开始到索引2结束的子列表[4,3,5],其中4 + 3 + 5 = 12,即使列表后面有一个较短的序列(5 + 7) )。另一方面,给定列表l为[1,2,3,4]并且键t为15,函数answer(l,t)将返回[-1,-1],因为没有子列表列表l的总和可以归结为给定的目标值t = 15。 为了帮助您识别编码广播,Bunny HQ已同意以下标准:
- 每个列表l将包含至少1个元素但不超过100个。
- l的每个元素都在1到100之间。
- t将是一个正整数,不超过250。
- 列表l的第一个元素是索引0.
- 对于answer(l,t)返回的列表,起始索引必须等于或小于结束索引。
请记住,为了摒弃Lambda的间谍,Bunny HQ可能包含多个连续的广播数量的子列表,可以归结为密钥。您知道该消息将始终隐藏在与该键相加的第一个子列表中,因此answer(l,t)应仅返回该子列表。
以下是我目前的解决方案。
def answer(l, t):
for index1, value1 in enumerate(l):
for index2, value2 in enumerate(l):
if sum(l[index1:index2]) == t:
return [index1, index2 -1]
return [-1, -1]
我能够通过4/5测试用例但是我在测试5上失败了。我不确定它失败了什么?我不一定非常希望找到一个解决方案,因为测试用例确实会失败!我找到了一个java solution,但遗憾的是,我对java一无所知!非常感谢任何帮助或提示!
答案 0 :(得分:1)
def answer(x,y):
a=[-1,-1]
c=list(x)
for keyi,i in enumerate(c):
for keyj,j in enumerate(c):
if sum(x[keyi:keyj+1]) == y:
return [keyi, keyj]
return a
迭代中的轻微问题错过了列表中的最后一个元素。
答案 1 :(得分:0)
以下是您失败的测试用例:
>>> answer([1, 2, 3], 6)
[-1, -1]
这也非常低效。应该是O(n)。或至少O(n 2 )。你的只有O(n 3 )。尝试使用一个列表,例如10000个数字和一个无法到达的目标。
答案 2 :(得分:0)
我考虑了一下,我想我有一个测试用例。
请记住,空列表的[4, 2]
为零。
无论外部循环在哪里,内部for循环都会遍历整个列表。
例如,列表sum(l[0:0])
以4作为目标,当两个循环都在同一索引(0)中时,sum(l[0:1])
等于零。但是,因为列表中有另一个元素,所以在下一个循环中[index1, index2 - 1]
确实等于4,并且返回[0, 0]
,这将是[4]
,所以这里没有问题。
如果没有比4更多的元素,我们的列表只是[0, 0]
,你就陷入了问题。这里的正确答案是sum(l[0:0])
但你的代码不会返回,因为正如我之前所说,[-1, -1]
总是等于零。您的情况永远不会得到满足,您将返回--history-api-fallback
答案 3 :(得分:0)
这是优化的解决方案!
def solution(l,t):
sum=0
j=0
for keyi,i in enumerate(l):
sum = sum + i
print(sum)
while(sum>t and j < keyi ):
sum = sum - l[j]
j = j + 1
if sum == t:
return [j,keyi]
return [-1,-1]