import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param operations string字符串一维数组 * @param values int整型一维数组 * @return int整型一维数组 */ public int[] processStackOperations (String[] operations, int[] values) { // stack1用来存放入栈的元素 Stack<Integer> stack1 = new Stack<>(); // stack2用来存放每个元素入栈时,此时的最大值 Stack<Integer> stack2 = new Stack<>(); // 用来存储最大元素(会在stack2出栈的时候,更新maxNumber为栈顶元素,也就是stack2.peek()) int maxNumber = Integer.MIN_VALUE; // 用来存储返回值的集合,最后转数组返回 ArrayList<Integer> arrayList = new ArrayList<>(); for (int i = 0; i < operations.length; i++) { String operation = operations[i]; if (operation.equals("push")) { // 更新最大值 注意values[i],我原本以为push是按values的顺序,其实这边是按push操作的当前索引,此时values[i]是什么数值,就push什么数值 maxNumber = Math.max(values[i],maxNumber); // 放入此时最大值 stack2.push(maxNumber); // 放入节点 stack1.push(values[i]); } else if (operation.equals("getMax")) { // 返回此时stack2的栈顶元素就是最大值 Integer number = stack2.peek(); arrayList.add(number); } else if (operation.equals("pop")) { // 如果stack1栈顶和stack2栈顶元素相等,此时又是pop操作,可能会把最大值更新 // 为什么是可能?因为如果栈里有两个相同的最大值,那么可能更新后还是相同的 Integer stack1Number = stack1.peek(); Integer stack2Number = stack2.peek(); if (stack1Number.equals(stack2Number)) { // 相等的话,stack2.pop() stack2.pop(); // 更新最大值 maxNumber = stack2.peek(); } stack1.pop(); } else if (operation.equals("top")) { // 直接返回栈1的栈顶元素即可 arrayList.add(stack1.peek()); } } // 集合转数组进行返回 int [] result = new int[arrayList.size()]; for (int i = 0; i < arrayList.size(); i++) { result[i] = arrayList.get(i); } return result; } }
本题知识点分析:
1.栈的出栈和入栈
2.集合的存取
3.集合转数组
4.数学模拟
本题解题思路分析:
1.stack1用来存放入栈的元素
2.stack2用来存放每个元素入栈时,此时的最大值
3.其他看注释就可以了,没过测试用例就需要修改细节,主要你想的可能跟它题目测试用例不太一样,稍微改下就行,如果不用额外空间的话,可以考虑维护差值
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞这支持一下,感谢~