You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言实现LeetCode两数之和返回错误结果,请求排查

两数之和问题调试与修复

我在解决两数之和问题时遇到了问题:输入数组为[]int{10, 40, 1, 4, 100, 137},目标值237,正确输出应为[100, 137],但我的Go代码返回[-1, -1]。我尝试用fmt.Println()查看变量值,但仍未定位到问题所在。

我的代码如下:

package main

import "fmt"

func main() {
    arr := []int{10, 40, 1, 4, 100, 137}
    targetVal := 237
    fmt.Println(twoSum(arr, targetVal))
}

func twoSum(nums []int, target int) []int {
    starter := 0
    // 寻找第一个小于目标值的元素下标
    for i := 0; i < len(nums); i++ {
        if nums[i] < target {
            starter = i
            break
        }
    }
    // 从starter开始遍历剩余元素
    for i := starter; i < len(nums); i++ {
        if target-nums[starter] == nums[i] {
            return []int{nums[starter], nums[i]}
        }
    }
    return []int{-1, -1}
}

问题分析

你的代码逻辑完全偏离了两数之和的核心要求:

  1. 第一个循环错误地将starter设为第一个小于目标值的元素下标(这里是0,对应元素10),之后就固定用这个元素去寻找配对值。但目标值237减去10等于227,数组中没有这个数,所以最终返回[-1,-1]。
  2. 两数之和的核心是找数组中任意两个不同元素,它们的和等于目标值,并非固定用某个特定元素去配对。

修复方案

这里提供两种常见的正确解法:

解法1:哈希表法(时间复杂度O(n))

利用哈希表存储已遍历元素的值,遍历过程中计算当前元素的补数(target - nums[i]),如果补数存在于哈希表中,直接返回这两个值:

package main

import "fmt"

func main() {
    arr := []int{10, 40, 1, 4, 100, 137}
    targetVal := 237
    fmt.Println(twoSum(arr, targetVal))
}

func twoSum(nums []int, target int) []int {
    numMap := make(map[int]bool)
    for _, num := range nums {
        complement := target - num
        if numMap[complement] {
            return []int{complement, num}
        }
        numMap[num] = true
    }
    return []int{-1, -1}
}

解法2:双重循环法(时间复杂度O(n²))

遍历每个元素,再遍历其后续元素,检查两者之和是否等于目标值:

package main

import "fmt"

func main() {
    arr := []int{10, 40, 1, 4, 100, 137}
    targetVal := 237
    fmt.Println(twoSum(arr, targetVal))
}

func twoSum(nums []int, target int) []int {
    n := len(nums)
    for i := 0; i < n; i++ {
        for j := i + 1; j < n; j++ {
            if nums[i] + nums[j] == target {
                return []int{nums[i], nums[j]}
            }
        }
    }
    return []int{-1, -1}
}

调试技巧建议

  1. 关键变量打印:在第一个循环结束后打印starter和nums[starter],你会发现它是10,而不是你需要的100,这就能快速定位到逻辑错误。
  2. 逻辑拆解验证:先明确问题的核心要求,再逐行验证自己的代码逻辑是否符合要求——比如你写第一个循环的目的是什么?这个逻辑是否能帮你找到正确的配对元素?
  3. 边界测试:测试一些极端情况,比如数组包含负数、多个可能的配对、只有两个元素等,帮助验证代码的鲁棒性。

内容的提问来源于stack exchange,提问作者Ivan Vorobjov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:22:47