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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:36:59