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

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
}

关键细节解释

  1. 指针变量的作用:maxOne、maxTwo、maxThree作为*int类型,初始nil明确表示“未赋值”。当找到符合条件的数时,用&num将该数的地址赋值给指针,后续可通过*maxOne访问对应的值。
  2. 去重逻辑优化:用map[int]bool记录已处理的数,遇到重复直接跳过,比计数式的map更节省内存和计算资源。
  3. 逻辑修正:原代码中无第三大值时返回maxTwo是错误的,题目要求返回最大数(即maxOne),这里已修正该问题。

测试你的案例

针对输入[]int{1,2,-2147483648},代码会正确识别-2147483648为第三大值并返回它;对于[]int{2,2,3,1}会返回1,[]int{3,2,1}返回1,完全符合题目要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:11:05