Go语言中如何判断int变量是否已被赋值?(LeetCode场景)
解决LeetCode第三大数问题中无法判断变量是否赋值的问题
我完全懂你的困扰——因为输入可能包含math.MinInt32这种边界值,用它初始化最大值变量会导致逻辑误判,而直接用nil初始化int变量又不被Go允许。这里有个精准的解决方案:用指针类型追踪最大值是否已被赋值,因为指针可以是nil,能完美区分“未赋值”和“等于某个特殊值”的情况。
核心思路
定义三个*int类型的变量(而非普通int),初始值设为nil,代表还没有对应的最大值被赋值。遍历数组时先做去重处理(用map[int]bool比计数的map[int]int更高效),然后依次和已有的最大值比较并更新指针指向;最后通过判断指针是否为nil来确定是否存在第三大的数,彻底摆脱依赖固定初始值的局限。
修改后的完整代码
import ( "math" ) func thirdMax(nums []int) int { seen := make(map[int]bool) // 仅用于去重,无需计数 var maxOne, maxTwo, maxThree *int for _, num := range nums { if seen[num] { continue // 跳过已处理过的重复值 } seen[num] = true // 更新第一大值 if maxOne == nil || num > *maxOne { maxThree = maxTwo maxTwo = maxOne maxOne = &num } else if num == *maxOne { continue } else if maxTwo == nil || num > *maxTwo { // 更新第二大值 maxThree = maxTwo maxTwo = &num } else if num == *maxTwo { continue } else if maxThree == nil || num >= *maxThree { // 更新第三大值 maxThree = &num } } // 判断是否存在第三大的数 if maxThree != nil { return *maxThree } // 没有第三大值时返回最大数 return *maxOne } func max(a, b int) int { if a > b { return a } return b }
关键细节解释
- 指针变量的作用:
maxOne、maxTwo、maxThree作为*int类型,初始nil明确表示“未赋值”。当找到符合条件的数时,用&num将该数的地址赋值给指针,后续可通过*maxOne访问对应的值。 - 去重逻辑优化:用
map[int]bool记录已处理的数,遇到重复直接跳过,比计数式的map更节省内存和计算资源。 - 逻辑修正:原代码中无第三大值时返回
maxTwo是错误的,题目要求返回最大数(即maxOne),这里已修正该问题。
测试你的案例
针对输入[]int{1,2,-2147483648},代码会正确识别-2147483648为第三大值并返回它;对于[]int{2,2,3,1}会返回1,[]int{3,2,1}返回1,完全符合题目要求。
内容的提问来源于stack exchange,提问作者maxflow
相关产品推荐
相关产品推荐

