Golang代码逻辑错误排查:找不到问题所在

Golang代码逻辑错误排查:找不到问题所在 我每天都会收到邮件发来的编程挑战题目。今天的题目让我很困惑,我找不出自己逻辑中遗漏了什么。

题目要求如下:

给定一个数组,表示从东到西相邻建筑的高度。城市评估员希望你编写一个算法,返回有多少栋建筑能够看到夕阳,以便正确评估街道价值。

例如,给定数组 [3, 7, 8, 3, 6, 1],你应该返回 3,因为高度为 861 的建筑顶层都能无遮挡地看到西边的景色。

你可以在以下游乐场链接中找到我当前的代码:

Go Playground - The Go Programming Language

在“helper”函数中的 return count + 1 之前直接添加 fmt.Println(buildings[currentIdx] 时,显示它正确找到了应该增加计数的索引,但最终结果仍然偏高。

非常感谢任何见解。 😎


更多关于Golang代码逻辑错误排查:找不到问题所在的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

这很简单——你的递归调用没有做任何事。只需在调用辅助函数前添加返回语句即可。

但可以简化。解决这个任务所需的就是在从东向西遍历时找到最大值更新的次数。

更多关于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)
	}
}

https://play.golang.org/p/cfrtb7S1jDG

根据你的描述和代码分析,问题出现在递归逻辑中对索引的处理上。当从右向左遍历时,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))
  • 这样确保从左到右(实际上是从右向左递归)检查每个建筑
  • 保持跟踪遇到的最大高度,只有当前建筑高度大于之前所有建筑的最大高度时才计数

这个算法从最西边的建筑开始(数组末尾),向东遍历,记录能够看到夕阳的建筑数量。

回到顶部