Google Foobar number_station_coded_messages

时间:2017-02-26 23:48:01

标签: python list

我正在尝试完成名为“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一无所知!非常感谢任何帮助或提示!

4 个答案:

答案 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]