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
这是一个很不错的实现!代码逻辑清晰,边界处理得当。以下是一些具体的点评和改进建议:
优点
- 函数职责分离良好,
hourglasSumAt专门计算单个沙漏和 - 边界检查合理,从
r=1开始避免越界 - 添加了行长度一致性检查,增强了健壮性
可以改进的地方
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语言编程习惯。

