Golang自学练习代码 - 求点评

Golang自学练习代码 - 求点评 这是一个面向初学者的HackerRank热身练习。如果有人愿意,我很想听听对这段代码的反馈。我是Go语言的新手,正努力提升自己编写地道代码的直觉:

func hourglasSumAt(arr [][]int32, row int, col int) int32 {
    r0, r2 := row - 1, row + 1
    c0, c2 := col - 1, col + 1
    return (arr[r0][c0] + arr[r0][col] + arr[r0][c2] +
    arr[row][col] +
    arr[r2][c0] + arr[r2][col] + arr[r2][c2])
}

func hourglassSum(arr [][]int32) int32 {
    max := int32(math.MinInt32)
    var row1len int
    if len(arr) > 0 {
        row1len = len(arr[0])
    }
    for r := 1; r < len(arr) - 1; r++ {
        if len(arr[r]) != row1len {
            log.Panic("All rows do not have", row1len, "cols. Found row with", len(arr[r]))
        }
        for c := 1; c < row1len - 1; c++ {
            if s := hourglasSumAt(arr, r, c); s > max {
                max = s
            }
        }
    }
    
    return max
}

更多关于Golang自学练习代码 - 求点评的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang自学练习代码 - 求点评的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个很不错的实现!代码逻辑清晰,边界处理得当。以下是一些具体的点评和改进建议:

优点

  1. 函数职责分离良好,hourglasSumAt专门计算单个沙漏和
  2. 边界检查合理,从r=1开始避免越界
  3. 添加了行长度一致性检查,增强了健壮性

可以改进的地方

1. 变量命名一致性

函数名hourglasSumAt拼写有误,应该是hourglassSumAt(少了一个’s’)

2. 使用更地道的错误处理

Go中更推荐使用panic以外的错误处理方式:

func hourglassSum(arr [][]int32) (int32, error) {
    if len(arr) < 3 {
        return 0, fmt.Errorf("array must have at least 3 rows")
    }
    
    row1len := len(arr[0])
    for i := 1; i < len(arr); i++ {
        if len(arr[i]) != row1len {
            return 0, fmt.Errorf("all rows must have same length, expected %d, got %d at row %d", 
                row1len, len(arr[i]), i)
        }
    }
    
    max := int32(math.MinInt32)
    for r := 1; r < len(arr)-1; r++ {
        for c := 1; c < row1len-1; c++ {
            if s := hourglassSumAt(arr, r, c); s > max {
                max = s
            }
        }
    }
    
    return max, nil
}

3. 简化边界检查逻辑

可以更早地进行输入验证:

func hourglassSum(arr [][]int32) int32 {
    if len(arr) < 3 {
        return math.MinInt32
    }
    
    cols := len(arr[0])
    if cols < 3 {
        return math.MinInt32
    }
    
    // 检查所有行长度一致
    for _, row := range arr {
        if len(row) != cols {
            return math.MinInt32
        }
    }
    
    max := int32(math.MinInt32)
    for r := 1; r < len(arr)-1; r++ {
        for c := 1; c < cols-1; c++ {
            sum := arr[r-1][c-1] + arr[r-1][c] + arr[r-1][c+1] +
                   arr[r][c] +
                   arr[r+1][c-1] + arr[r+1][c] + arr[r+1][c+1]
            if sum > max {
                max = sum
            }
        }
    }
    
    return max
}

4. 使用命名返回值(可选)

对于简单函数,命名返回值可以使代码更清晰:

func hourglassSumAt(arr [][]int32, row, col int) (sum int32) {
    sum = arr[row-1][col-1] + arr[row-1][col] + arr[row-1][col+1] +
          arr[row][col] +
          arr[row+1][col-1] + arr[row+1][col] + arr[row+1][col+1]
    return
}

5. 性能优化考虑

当前实现的时间复杂度是O(n²),已经是最优解。空间复杂度是O(1),无法进一步优化。

总结

你的代码已经很好地解决了问题,展示了良好的Go语言基础。主要改进点在于错误处理和代码风格的一致性。继续练习,你会很快掌握地道的Go语言编程习惯。

回到顶部