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

116 阅读2分钟

大家好,今天我来分享我的豆包MarsCode AI刷题。这次我将解决的是股票价格上涨天数计算问题,这个问题虽然比较简单,但是有一些细节需要注意,这里我就来分享一下。

问题描述

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

示例

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

解题步骤

这个问题思路是依次判断每一个元素后面是否有比它大的元素,如果有则返回两者索引的差值即可,可能乍一看比较麻烦,需要对每一个元素从头到尾遍历一遍,实际上不需要,可以巧妙利用栈的结构来进行判断。

实现代码

ini
 代码解读
复制代码
public static int[] solution(int N, int[] stockPrices) {
        // write code here
        Stack<Integer> stack1 = new Stack<>();
        Stack<Integer> stack2 = new Stack<>();
        int []arr = new int[N];
        for (int i = 0; i < arr.length; i++) {
            arr[i]=0;
        }
        for (int i = 0; i < stockPrices.length-1; i++) {
            stack1.push(i);
            stack2.push(stockPrices[i]);
            while(stack2.size()!=0 && stockPrices[i+1]>stack2.peek()){
                arr[stack1.peek()]=i+1-stack1.peek();
                stack1.pop();
                stack2.pop();
            }
        }
        return arr;
}

细节注意

这道题我刚开始是想到用一个栈进行判断,栈来存储元素的索引,但后来又出现了一个错误,怀疑是不是用栈来解决不是很正确。但后来反应过来可以定义两个栈,一个栈用来存储元素的索引,一个栈用来存储元素的值,再定义一个和股票价格列表长度相同的全0数组。然后依次遍历股票数组,将索引和值分别入栈,这时要注意比较的是下一个元素和栈顶元素的大小关系,由于需要从当前索引开始比较,所以和栈顶比,然后如果大于当前栈顶元素,则依次出栈,将栈顶元素索引对应的值修改为两者索引的差值。用两个栈的优点就是能在比较每一个元素的同时,还能够修改索引的差值。并且这里还要注意的遍历不用遍历所有的元素,最后一个元素不用遍历,因为最后一个元素必定是0。同时在为数组赋值时,是i+1-stack1.peek(),因为是下一个元素和栈顶元素进行比较,所以要加1.