Python 程序,用于查找与键相加的子列表

标签 python

我被要求编写一个 python 函数来验证列表 l(即一个连续的子列表)中是否至少有一个连续的正整数序列可以总结为给定的目标正整数 t(键)和返回字典序最小的列表,其中包含可以找到该序列的最小开始和结束索引,或者在没有这样的序列的情况下返回数组 [-1, -1]。例如,包含元素 [4, 3, 5, 7, 8] 和键 t 为 12 的列表 l,该函数将返回列表 [0,2],因为该列表包含值 4,3 和5 和另一个包含元素 [1,2,3,4] 和键 t 为 15 的列表 l,该函数将返回 [-1,-1],因为列表 l 没有可以求和的子列表到给定的目标值 t = 15。我应该编写一个函数来标识第一个给定的总和为键 t 的子列表,因此它应该只返回一个子列表。子列表只能通过以下方式识别:

  • 每个列表 l 将包含至少 1 个元素,但不会超过 100 个。
  • l 的每个元素都在 1 到 100 之间。
  • t 为正整数,不超过 250。
  • 列表 l 的第一个元素的索引为 0。
  • 对于由 solution(l, t) 返回的列表,开始索引必须等于或小于结束索引。
    到目前为止,我已经能够实现我之前提到的前两个示例。这是我迄今为止尝试过的:
  • def solution(l, t):
        if len(l) <= 100 and len(l) > 0 and t > 0 and t <= 250:
            if all(a<100 for a in l):
                for j in range(0, len(l) - 1):
                    for k in range(0, len(l)):
                        for m in range(0, len(l)):
                            if l[j] + l[k] == t or l[j] + l[k] + l[m] == t:
                                if j + 1 == k and k + 1 == m:
                                    return (j, k) if l[j] + l[k] == t else (j,k, m) if l[j] + l[k] + l[m] == t else (-1,-1)
                return (-1,-1)
            else:
                return False
        else:
            return False
    
    我的函数只返回最多 3 个值的列表,我希望它返回任意数量的值。请帮助我,因为这将在 4 天内到期。非常感谢帮助,请对我放轻松,因为我对 Python 的经验很少。

    最佳答案

    def find_seq(inp_list,target):
        start = end = 0
        while start < len(inp_list):
            value = sum(inp_list[start:end+1])
            if value > target:
                start += 1
                if start > end and end < len(inp_list):
                    end += 1
            elif value < target:
                if end < len(inp_list):
                    end += 1
                else:
                    return [-1,-1]
            else:
                return [start,end]
        return [-1,-1]
    find_seq([4, 3, 5, 7, 8],12) # [0, 2]
    
    由于您关注的是连续的正整数子列表,因此可以简化问题。
    我们限制自己在数字中从左到右移动,即开始/结束只能增加,不能减少。这不应该导致我们丢失任何解决方案,因为我们可以通过从头开始并增加所选子列表的开始/结束以及以下进一步解释的其他原因来到达任何可能的子列表。
    给定一个连续的子列表,您的值可能太大、太小或等于目标。如果它等于目标,那么你就完成了。
    如果它太大,那么你需要删除一些数字。由于我们只是向右移动,因此删除数字的唯一方法是增加起点。为了确保我们不会跳过任何解决方案,我们将 start 增加尽可能小的数量,即 1。我们不能让 start 超出我们子列表的末尾,所以如果 start 和 end 彼此相等,我们必须增加两者。我们不能让结尾越过输入列表的结尾,所以我们只在可能的情况下增加结尾。
    另一方面,如果当前子列表总和太小,我们需要添加数字。这意味着我们需要增加结尾,这会给我们一个新的数字来包含在总和中。由于结尾不能越过输入列表的结尾,所以我们只在可以的情况下递增。如果我们不能,那就意味着我们没有数字可以添加,我们的值(value)太小了。这意味着我们永远不会达到该值,我们可以以 (-1,-1) 结果(没有匹配项添加到目标)终止。
    你可能会问,为什么我们不把起点向后移动呢?好吧,如果我们这样做了,我们将得到一个太大的值(甚至不包括输入列表中的最后一个数字),而且我们的结束索引必须达到最后。请记住,起始索引仅在前一个总和太大时才增加,因此在某些时候我们增加了起始索引,因为总和太大。自从那个决定以来,我们已经向前推进了更多的事情。因此,将开始向后移动会导致子列表太大。
    最后,如果 start 曾经到达输入列表的末尾,那么我们已经经历了所有的可能性并且一无所获。
    从性能的角度来看,您可以通过仅跟踪一个总和值并在每次增加结束时添加新值并减去旧的左值来实现每次循环迭代的整个开始到结束子列表的总和增加开始的时间。我不想这样做,但你可以。

    关于Python 程序,用于查找与键相加的子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65771053/

    相关文章:

    python - TFRecordReader 似乎非常慢,多线程读取不工作

    python - 如何更改 Amazon S3 中对象的元数据

    python - Pandas 数据框平均值

    python - 链接的 popen 进程未获得输出

    python - seaborn jointplot 按密度颜色

    调用前的 Python 修饰函数

    python - Django:timezone.now() 不返回当前日期时间

    Python Scrapy爬行在chrome中使用xpath元素选择和selenium花费太多时间

    python - 如何使用 PIL 将矩形图像映射到四边形?

    python - 在不知道名称的情况下打印所有 POST 请求参数