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} }
问题分析
你的代码逻辑完全偏离了两数之和的核心要求:
- 第一个循环错误地将
starter设为第一个小于目标值的元素下标(这里是0,对应元素10),之后就固定用这个元素去寻找配对值。但目标值237减去10等于227,数组中没有这个数,所以最终返回[-1,-1]。 - 两数之和的核心是找数组中任意两个不同元素,它们的和等于目标值,并非固定用某个特定元素去配对。
修复方案
这里提供两种常见的正确解法:
解法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} }
调试技巧建议
- 关键变量打印:在第一个循环结束后打印
starter和nums[starter],你会发现它是10,而不是你需要的100,这就能快速定位到逻辑错误。 - 逻辑拆解验证:先明确问题的核心要求,再逐行验证自己的代码逻辑是否符合要求——比如你写第一个循环的目的是什么?这个逻辑是否能帮你找到正确的配对元素?
- 边界测试:测试一些极端情况,比如数组包含负数、多个可能的配对、只有两个元素等,帮助验证代码的鲁棒性。
内容的提问来源于stack exchange,提问作者Ivan Vorobjov
相关产品推荐
相关产品推荐

