【问题标题】:Two Sum Index List Out of Range两个总和索引列表超出范围
【发布时间】:2021-06-28 15:37:57
【问题描述】:

我在 leetcode 上的问题“两个总和”中不断收到错误“列表索引超出范围”,我知道使用 dict 有一种更快的方法来解决它,但是,我刚刚开始 leetcode,我想知道为什么我会收到此错误。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        i = 0
        j = i + 1
        for i in range(len(nums)):
            for j in range(len(nums)):
                
                if i + j == target:
                    
                    return(nums[i], nums[j])
                
                else:
                    
                    i = i + 1

【问题讨论】:

  • i = i + 1 更改i 的值,因此nums[i] 可能会访问num[len(nums)],这会导致错误。尝试print中间步骤的结果进行调试。

标签: python python-3.x list loops nested-lists


【解决方案1】:

如果你删除最后两行,它会起作用,而这两行 3 和 4 额外;所以

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(len(nums)):
                
                if i + j == target:
                    
                    return(nums[i], nums[j])

如果 i 需要比 j 高 1 个数字:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        for i in range(len(nums)):
            for j in range(1, len(nums) + 1):
                
                if i + j == target:
                    
                    return(nums[i], nums[j])

【讨论】:

    【解决方案2】:

    您在内部j 循环的else 分支中递增i。这将使您的 i 变量以与内部循环中的 j 相同的速度向前移动。因此,当外部循环中的i 大于零时,假设您的索引未与目标相加,您将得到一个超出范围的错误,正如您在if 中所检查的那样。

    不过,编写的代码存在几个问题。

    • 在开始循环之前将j 设置为i + 1。这将在每次内部循环开始时立即被覆盖(因为它将由range 方法调用定义)。
    • 您检查if i + j == target,当您应该检查这些索引处的数组值时,例如if nums[i] + nums[j] == target
    • 您正在增加内部j 循环内的i 变量,而没有在该循环中检查它。 range 检查只会在外循环结束时验证 i 是否在外循环的范围内。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2011-06-14
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多