Golang代码逻辑错误排查:找不到问题所在
Golang代码逻辑错误排查:找不到问题所在 我每天都会收到邮件发来的编程挑战题目。今天的题目让我很困惑,我找不出自己逻辑中遗漏了什么。
题目要求如下:
给定一个数组,表示从东到西相邻建筑的高度。城市评估员希望你编写一个算法,返回有多少栋建筑能够看到夕阳,以便正确评估街道价值。
例如,给定数组
[3, 7, 8, 3, 6, 1],你应该返回3,因为高度为8、6和1的建筑顶层都能无遮挡地看到西边的景色。
你可以在以下游乐场链接中找到我当前的代码:
Go Playground - The Go Programming Language
在“helper”函数中的 return count + 1 之前直接添加 fmt.Println(buildings[currentIdx] 时,显示它正确找到了应该增加计数的索引,但最终结果仍然偏高。
非常感谢任何见解。

更多关于Golang代码逻辑错误排查:找不到问题所在的实战教程也可以访问 https://www.itying.com/category-94-b0.html
这很简单——你的递归调用没有做任何事。只需在调用辅助函数前添加返回语句即可。
但可以简化。解决这个任务所需的就是在从东向西遍历时找到最大值更新的次数。
更多关于Golang代码逻辑错误排查:找不到问题所在的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
jrswab:
我每天都会收到发送到我邮箱的编程挑战。
是谁在发送这些挑战?我也想看看。
我会采用简单的方法,反向遍历所有项目,并比较最高高度和当前高度。如果当前高度大于最高高度,则表示该建筑能看到阳光。
import "fmt"
var buildings = []int{1, 9, 8, 3, 5, 6, 7, 2}
func main() {
heighest := 0
sunViews := []int{}
for i := len(buildings) -1; i >= 0; i-- {
h := buildings[i]
if h > heighest {
sunViews = append(sunViews, h)
heighest = h
}
}
for _, h := range sunViews {
fmt.Println(h)
}
}
根据你的描述和代码分析,问题出现在递归逻辑中对索引的处理上。当从右向左遍历时,currentIdx 递减的方式会导致重复计数。
以下是修正后的代码:
package main
import "fmt"
func SunsetViews(buildings []int) int {
if len(buildings) == 0 {
return 0
}
return helper(buildings, len(buildings)-1, -1)
}
func helper(buildings []int, currentIdx int, maxHeight int) int {
if currentIdx < 0 {
return 0
}
currentHeight := buildings[currentIdx]
count := helper(buildings, currentIdx-1, max(maxHeight, currentHeight))
if currentHeight > maxHeight {
return count + 1
}
return count
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
fmt.Println(SunsetViews([]int{3, 7, 8, 3, 6, 1})) // 输出: 3
fmt.Println(SunsetViews([]int{1, 2, 3, 4, 5})) // 输出: 5
fmt.Println(SunsetViews([]int{5, 4, 3, 2, 1})) // 输出: 1
fmt.Println(SunsetViews([]int{1, 1, 1, 1, 1})) // 输出: 1
}
问题分析:
原始代码中,递归调用时使用 currentIdx-2 会导致跳过某些建筑,从而产生错误的计数。正确的做法应该是每次递减1来遍历所有建筑。
关键修正:
- 将
helper(buildings, currentIdx-2, max(maxHeight, currentHeight))改为helper(buildings, currentIdx-1, max(maxHeight, currentHeight)) - 这样确保从左到右(实际上是从右向左递归)检查每个建筑
- 保持跟踪遇到的最大高度,只有当前建筑高度大于之前所有建筑的最大高度时才计数
这个算法从最西边的建筑开始(数组末尾),向东遍历,记录能够看到夕阳的建筑数量。


