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

Equal Stacks算法实现错误排查:输出与预期结果不符

Equal Stacks算法错误排查

问题背景

三个圆柱堆叠,每个圆柱直径相同,需找出三堆叠高度相等的最大可能高度(高度为堆叠元素之和)。

示例输入

5 3 4
3 2 1 1 1
4 3 2
1 1 4 1

输入说明:三堆叠分别有5、3、4个圆柱,后续行对应各圆柱高度。

预期输出

5

你的程序输出

7

你的实现代码

function equalStacks(h1, h2, h3) {
    let sum1 = h1.reduce((acc, curr) => acc + curr)
    let sum2 = h2.reduce((acc, curr) => acc + curr)
    let sum3 = h3.reduce((acc, curr) => acc + curr)
    let minHeight = Math.min(sum1, sum2, sum3)
        
    while (!(sum1 == sum2 && sum2 == sum3)){    
        if(minHeight == 0) return 0
            
        if(sum1 > minHeight){
            sum1 -= h1.pop()
        }
        
        if(sum2 > minHeight){
            sum2 -= h2.pop()
        }
        
        if(sum3 > minHeight){
            sum3 -= h3.pop()
        }
        
        minHeight = Math.min(sum1, sum2, sum3)
        
        if(sum1 == sum2 && sum2 == sum3) return sum1
    }
}

你的实现思路

  • 先计算三个数组的总和,确定最小高度,若最小高度为0则返回0;
  • 初始化while循环,循环条件为三堆叠高度不同;
  • 若堆叠高度大于当前最小高度,则弹出栈顶元素并减少对应总和;
  • 更新最小高度,若三高度相等则返回该高度。

错误原因分析

核心错误是对堆叠元素顺序的理解偏差:
题目中每个堆叠的输入数组是从顶部到下方的顺序(第一个元素是堆叠的最顶部,最后一个是最底部),而你错误地将数组尾部元素当作顶部,使用pop()移除尾部元素,但实际上只能从顶部移除元素,对应数组的第一个元素,应该用shift()方法。

结合示例输入具体看:

  1. 第一个堆叠[3,2,1,1,1]:你的代码用pop()移除尾部的1,总和从8变为7;但正确顶部是第一个元素3,移除后总和变为2+1+1+1=5。
  2. 第二个堆叠[4,3,2]:你的代码用pop()移除尾部的2,总和从9变为7;正确顶部是4,移除后总和变为3+2=5。
  3. 第三个堆叠[1,1,4,1]:你的代码因初始总和7等于min未操作;正确步骤是先移除顶部的1(总和变为6),再移除顶部的1(总和变为5)。

修正后三个堆叠总和均为5,与预期一致。

修正后的代码

function equalStacks(h1, h2, h3) {
    let sum1 = h1.reduce((acc, curr) => acc + curr)
    let sum2 = h2.reduce((acc, curr) => acc + curr)
    let sum3 = h3.reduce((acc, curr) => acc + curr)
    let minHeight = Math.min(sum1, sum2, sum3)
        
    while (!(sum1 === sum2 && sum2 === sum3)) {    
        if (minHeight === 0) return 0
            
        if (sum1 > minHeight) {
            sum1 -= h1.shift() // 改为shift()移除顶部元素(数组第一个元素)
        }
        
        if (sum2 > minHeight) {
            sum2 -= h2.shift()
        }
        
        if (sum3 > minHeight) {
            sum3 -= h3.shift()
        }
        
        minHeight = Math.min(sum1, sum2, sum3)
    }
    return sum1 // 循环结束后确保返回结果
}

内容的提问来源于stack exchange,提问作者shyshy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:05:54