使用Golang Map求解AOC2021 Day6时结果每次不同,求排查
排查Advent of Code 2021第6题Map实现的结果不一致问题
核心问题:Timer=0时的赋值逻辑错误
你的代码结果不一致的根本原因是处理timer=0的鱼时,直接用赋值(=)而非累加(+=),导致覆盖了其他鱼转换过来的同timer数值。
当timer=0时,你当前的代码是:
tempFishTimerData[8] = numOfFishes tempFishTimerData[6] = numOfFishes
但如果当天有其他timer(比如timer=7)的鱼转换为timer=6,或者其他逻辑生成timer=8的数值,直接赋值会覆盖掉之前的累加结果。加上Go语言中map的遍历顺序是随机的,每次运行时不同timer的处理顺序不同,覆盖的情况也不一样,最终导致每次结果都不一致。
不是内存泄漏问题
结果不一致和内存泄漏无关,完全是业务逻辑错误导致的。
修正后的代码
把timer=0的处理改为累加操作即可:
package main import ( "fmt" "os" "strconv" "strings" ) func getInput() []int { var parsedData []int rawData, _ := os.ReadFile("input.txt") data := strings.Split(string(rawData), ",") for _, strNum := range data { num, _ := strconv.Atoi(strNum) parsedData = append(parsedData, num) } return parsedData } func main() { data := getInput() var total int64 fishWithSameTimer := make(map[int]int64) for _, timer := range data { fishWithSameTimer[timer] += 1 } const days int = 18 currDay := 1 for currDay <= days { tempFishTimerData := make(map[int]int64) for timer, numOfFishes := range fishWithSameTimer { if timer == 0 { // 改为累加,避免覆盖 tempFishTimerData[8] += numOfFishes tempFishTimerData[6] += numOfFishes } else { tempFishTimerData[timer-1] += numOfFishes } } fishWithSameTimer = tempFishTimerData fmt.Println("Day:", currDay, fishWithSameTimer) currDay++ } fmt.Println(fishWithSameTimer) for _, num := range fishWithSameTimer { total += num } fmt.Println(total) }
更优方案:用数组替代Map
由于鱼的timer范围固定是0-8,使用数组比Map更高效,还能避免Map遍历顺序的问题:
func main() { data := getInput() var total int64 var fishCounts [9]int64 for _, timer := range data { fishCounts[timer]++ } const days int = 18 for day := 0; day < days; day++ { var nextCounts [9]int64 for i := 0; i < 9; i++ { if i == 0 { nextCounts[6] += fishCounts[i] nextCounts[8] += fishCounts[i] } else { nextCounts[i-1] += fishCounts[i] } } fishCounts = nextCounts } for _, count := range fishCounts { total += count } fmt.Println(total) }
内容的提问来源于stack exchange,提问作者Kanuor
相关产品推荐
相关产品推荐

