股票价格上涨天数计算 | 豆包MarsCode AI刷题

199 阅读2分钟

题目链接
股票价格上涨天数计算 - MarsCode

问题描述
小C是一名股票交易员,最近他关注某只股票的价格波动。给定该股票连续N天的价格列表 stockPrices,你需要为小C生成一个新列表,每个位置的值表示从那天起至少需要等待多少天才能看到价格上涨。如果没有上涨的情况,则对应位置的值为0。

例如,对于股票价格列表 [33, 34, 14, 12, 16],从第一天价格 33 开始,价格上涨发生在第二天价格 34,所以输出 1。若某天之后不再有价格上涨,则输出 0。

测试样例
样例1:

输入:N = 5, stockPrices = [33, 34, 14, 12, 16]
输出:[1, 0, 2, 1, 0]

样例2:

输入:N = 6, stockPrices = [45, 44, 46, 43, 42, 48]
输出:[2, 1, 3, 2, 1, 0]

样例3:

输入:N = 3, stockPrices = [10, 9, 8]
输出:[0, 0, 0]

问题分析
这道题目类似于“下一个更大元素”问题,同样可以使用栈来解决,栈可以帮助我们找到每一个价格之后的第一个比他高的价格。当栈顶元素对应价格小于当前价格,即找到了栈顶元素价格上涨的情况,就弹出栈顶元素并计算当前价格与栈顶元素价格对应的下标距离,存储在res中。然后将当前价格下标压入栈中。需要注意的是栈中存储的是价格的下标而非价格,这样做的目的是为了便于计算“上涨天数”,也就是下标之前的差。当遍历完价格列表后,栈中可能还有剩余的元素,这些元素表示这些天之后没有价格上涨的情况,因此需要将这些元素对应的res值设为0。

下一个更大元素
问题描述:给定一个数组 nums,你需要找到数组中每个元素的“下一个更大的元素”。下一个更大的元素是指在当前元素右侧的第一个比它大的元素。如果不存在这样的元素,则返回 -1

function solution(N, stockPrices) {
    let res = Array(N).fill(0);
    let stack = [];

    for (let i = 0; i < N; i++) {
        while (stack.length > 0 && stockPrices[stack[stack.length - 1]] < stockPrices[i]) {
            let prevIndex = stack.pop();
            res[prevIndex] = i - prevIndex;
        }
        stack.push(i);
    }

    // 处理剩余元素
    while (stack.length > 0) {
        let prevIndex = stack.pop();
        res[prevIndex] = 0;
    }

    return res;
}

最后还是利用豆包MarsCode将JavaScript代码转成python代码并提交

def solution(N, stockPrices):
    res = [0] * N  # 初始化结果数组,长度为 N,初始值为 0
    stack = []  # 初始化空栈,用于存储价格的下标

    for i in range(N):
        while stack and stockPrices[stack[-1]] < stockPrices[i]:
            prev_index = stack.pop()
            res[prev_index] = i - prev_index
        stack.append(i)

    # 处理剩余元素
    while stack:
        prev_index = stack.pop()
        res[prev_index] = 0

    return res

image.png