【问题标题】:Google Foobar number_station_coded_messagesGoogle Foobar number_station_coded_messages
【发布时间】:2020-05-20 01:46:20
【问题描述】:

我正在尝试完成题为“number_station_coded_messages”的 google foo.bar 2 级挑战。问题来了:

给定一个非空的正整数列表 l 和一个目标正整数 t,编写一个函数 answer(l, t) 来验证列表 l 中是否至少有一个连续的正整数序列(即一个连续的sub-list) 可以求和到给定的目标正整数 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一无所知!非常感谢任何帮助或提示!

【问题讨论】:

  • @StefanPochmann 解决方案效率低下会导致您无法通过某个测试用例吗?我不知道它是如何工作的。
  • 是的,当然。效率很重要。
  • 鉴于这是谷歌的自动招聘筛选,你认为这算作弊吗?
  • 可能是作弊。不过,有很多人在这些挑战上寻求帮助。由于我不是从谷歌找工作,也无法找到工作,所以我不担心寻求帮助。
  • 这种情况怎么样? "返回包含可以找到此序列的最小开始和结束索引的字典最小列表"

标签: python list


【解决方案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

迭代中的小问题错过了列表中的最后一个元素。

【讨论】:

    【解决方案2】:

    这是一个你失败的测试用例:

    >>> answer([1, 2, 3], 6)
    [-1, -1]
    

    它也非常低效。应该是 O(n)。或者至少 O(n2)。你的只有 O(n3)。尝试使用包含 10000 个数字和无法到达的目标的列表。

    【讨论】:

    • 在后面的描述中它说列表的最大可以是 100 个元素。是否有可能只是超时而我失败了?
    • 那么请给我们整个问题,而不仅仅是部分。
    • 我很抱歉,这个问题的自述文件很长,我试图尽量减少我的问题。我将使用更多信息编辑我的问题。
    • @JoshuaDay 大小 100 可能不是速度,所以我更仔细地查看并添加了一个您失败的小测试用例。
    • 谢谢!您的答案和 You Ssef 的答案相结合帮助我解决了这个问题!既然我已经解决了这个问题,你介意给我看看或者给我一个更有效的解决方案的提示吗?我对这种事情知之甚少。
    【解决方案3】:

    我想了一下,我想我有一个测试用例。 请记住,空列表的sum 为零。

    无论外部循环在哪里,您的内部 for 循环都会遍历整个列表。 以列表 [4, 2] 为例,以 4 为目标,当两个循环在同一索引 (0) 中时,sum(l[0:0]) 等于零。但是,由于列表中还有另一个元素,所以在下一个循环中sum(l[0:1]) 确实等于4,而您返回[index1, index2 - 1] 将是[0, 0],所以这里没有问题。

    如果没有比 4 更多的元素,我们的列表将只是 [4],你会遇到问题。这里的正确答案是[0, 0],但您的代码不会返回它,因为正如我之前所说,sum(l[0:0]) 始终等于零。你的条件永远不满足,你会返回[-1, -1]

    【讨论】:

      【解决方案4】:

      这是优化的解决方案!

      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]
      
      

      【讨论】:

      • 欢迎来到 Stack Overflow。没有任何解释的代码转储很少有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请edit您的问题并解释它如何比OP提供的更好。
      猜你喜欢
      • 2017-02-27
      • 2021-10-19
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多