Leetcode-面试题 03.03 堆盘子
2021-10-12 本文已影响0人
itbird01
面试题 03.03. 堆盘子
解题思路
1.分析题意,有多个栈用于储存数据,栈扩充的前提是当前栈已存储满
2.用LinkedList来存储多个栈,可以进行末尾栈的直接操作
3.push操作,如果list末尾栈size>=cap,则新建栈放入list末尾,存储x;否则直接用list末尾栈存储x
4.pop操作,直接返回List末尾栈的,pop操作元素,并且此时需要判断,pop之后,如果当前list末尾栈为空,则从list移除当前栈
5.popAt操作,从list中选择相应的栈,进行pop操作,此时需要判断,pop之后的栈大小,如果当前栈为空,则从list移除当前栈
6.当栈中没有元素或不存在该栈时,pop,popAt 应返回 -1
7.stackcap 需要考虑为0时,即栈中无法存储元素
解题遇到的问题
1.当栈中没有元素或不存在该栈时,pop,popAt 应返回 -1
2.stackcap 需要考虑为0时,即栈中无法存储元素
3.push与pop时,需要考虑list.size为0、栈为空等多种特殊情况
后续需要总结学习的知识点
1.不使用LinkedList,是否有其他解法?
##解法
import java.util.LinkedList;
import java.util.Stack;
class StackOfPlates {
LinkedList<Stack<Integer>> stacklist = new LinkedList<Stack<Integer>>();
int stackMaxIndex = 0;
public StackOfPlates(int cap) {
stackMaxIndex = cap;
stacklist.add(new Stack<Integer>());
}
public void push(int val) {
if (stackMaxIndex == 0) {
return;
}
if (stacklist.size() == 0 || stacklist.getLast() == null
|| stacklist.getLast().size() >= stackMaxIndex) {
stacklist.add(new Stack<Integer>());
}
stacklist.getLast().push(val);
}
public int pop() {
if (stacklist.size() == 0 || stacklist.getLast() == null
|| stacklist.getLast().isEmpty() || stackMaxIndex == 0) {
return -1;
}
int result = stacklist.getLast().pop();
if (stacklist.getLast().isEmpty()) {
stacklist.removeLast();
}
return result;
}
public int popAt(int index) {
if (stacklist.size() <= index || stackMaxIndex == 0) {
return -1;
}
int result = stacklist.get(index).pop();
if (stacklist.get(index).isEmpty()) {
stacklist.remove(index);
}
return result;
}
}