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

JavaScript栈实现下一个更大元素:代码不符合预期求助

下一个更大元素函数问题分析与修正指引

核心问题分析

你的代码思路选用栈来解决问题是正确的,但存在几个关键逻辑错误导致结果不符合预期:

  1. 栈存储内容错误:直接存储元素值,无法对应result数组的正确索引位置,导致结果顺序混乱。比如测试用例1中的23,它之后没有更大元素,应该对应result[1]为-1,但你的代码未给它分配正确位置,最后错误地将其作为剩余元素把-1追加到结果末尾。
  2. 遍历逻辑错误:仅遍历到倒数第二个元素,且每次直接将当前元素入栈后用下一个元素比较,无法覆盖所有元素的匹配逻辑。比如第一个元素56,之后没有更大元素,应对应result[0]为-1,但你的代码最后通过unshift添加,导致其他元素位置错位。
  3. 剩余栈元素处理逻辑错误:通过判断是否为数组第一个元素来决定unshift或push -1,完全不符合需求。剩余栈中的元素都是未找到下一个更大元素的,应根据它们的原始索引在result对应位置填充-1。

修正方向

  1. 栈改为存储元素索引:精准定位result数组需要填充的位置,避免结果顺序混乱。
  2. 从数组末尾开始遍历:这是单调栈解决下一个更大元素的标准方案,维护一个单调递减栈(栈顶为当前元素之后的第一个更大元素):
    • 遍历第i个元素时,先弹出栈中所有比当前元素小的元素(这些元素不可能成为前面元素的更大值);
    • 栈不为空时,栈顶对应的元素就是当前元素的下一个更大值,否则填-1;
    • 将当前元素的索引压入栈,作为前面元素的候选更大值。
  3. 初始化固定长度的result数组:提前创建与输入数组长度一致的数组,按索引填充结果,避免顺序错位。

修正后的示例代码

function greaterL(arr) {
    const stack = [];
    const result = new Array(arr.length).fill(-1);
    // 从后往前遍历数组
    for (let i = arr.length - 1; i >= 0; i--) {
        // 弹出栈中所有小于等于当前元素的索引
        while (stack.length > 0 && arr[stack[stack.length - 1]] <= arr[i]) {
            stack.pop();
        }
        // 栈不为空则取栈顶元素对应的值作为当前元素的下一个更大元素
        if (stack.length > 0) {
            result[i] = arr[stack[stack.length - 1]];
        }
        // 当前元素索引入栈
        stack.push(i);
    }
    return result;
}

测试验证:

console.log(greaterL([56, 23, 1, 5, 18, 17])) // 输出:[-1, -1, 5, 18, -1, -1]
console.log(greaterL([70, 60, 1, 4, 8, 12, 50, 23])) // 输出:[-1,-1, 4, 8, 12, 50, -1, -1]

补充说明

如果坚持从前往后遍历,核心逻辑仍需保持栈存索引、结果数组按索引填充,避免随意向result中push值。但从后往前遍历的实现更直观且不易出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:19:59