Leetcode面T3(1-5)栈,已拿到offer

Stack stack = new Stack();

stack.push(val);

stackList.add(stack);

return;

}

//栈未达到最大值就从容器中最后一个栈的末尾入栈

stackList.get(stackList.size() - 1).push(val);

}

public int pop() {

//直接调用已定义好的方法,下标参数为容器中最后一个栈的下标

return popAt(stackList.size() - 1);

}

public int popAt(int index) {

//下标越界

if (index < 0 || index >= stackList.size()) {

return -1;

}

//得到容器中下标对应的栈

Stack stack = stackList.get(index);

//栈为空

if (stack.isEmpty()) {

return -1;

}

//出栈

int res = stack.pop();

//栈为空时要把这个空栈删除

if (stack.isEmpty()) {

stackList.remove(index);

}

//将出栈的元素返回

return res;

}

}

/**

  • Your StackOfPlates object will be instantiated and called as such:

  • StackOfPlates obj = new StackOfPlates(cap);

  • obj.push(val);

  • int param_2 = obj.pop();

  • int param_3 = obj.popAt(index);

*/

Q3.4 化栈为队

实现一个MyQueue类,该类用两个栈来实现一个队列。

示例:

MyQueue queue = new MyQueue();

queue.push(1);

queue.push(2);

queue.peek();  // 返回 1

queue.pop();   // 返回 1

queue.empty(); // 返回 false

我们知道:同一段序列,分别存进一个栈和一个队列,那么出栈序列T和出队序列S顺序刚好是相反的。

那么,假如我们有两个栈的话,一段序列list通过第一个栈后,再压入第二个栈,这时第二个栈的出栈序列应该和list直接压入队列后的出队序列是一样的。

既然如此,我们用两个栈就可以模拟队列,一个栈专门用来存入数据,记为StackWrite;一个栈专门用来读取数据,记为StackRead。基于上面的结论,我们每次入队时,就把数据压入StackWrite,每次读数据时,就把StackWrite中的数据再压入StackRead,这时StackRead中的栈顶元素就是我们所期望的队首元素

在出队的时候,要注意一点:

  • 如果StackRead中有数据,那么就直接弹出StackRead的栈顶元素;

  • 如果StackRead为空,先考虑把StackWrite中的元素压入StackRead,再弹出StackRead的栈顶元素。

class MyQueue {

Stack stackWrite; // 存数据

Stack stackRead; // 读数据

/** Initialize your data structure here. */

public MyQueue() {

stackWrite = new Stack<>();

stackRead = new Stack<>();

}

/** Push element x to the back of queue. */

public void push(int x) {

stackWrite.push(x);

}

/** Removes the element from in front of queue and returns that element. */

public int pop() {

peek();

return stackRead.pop();

}

/** Get the front element. */

public int peek() {

if (!stackRead.isEmpty()) {

return stackRead.peek();

}

while (!stackWrite.isEmpty()) {

stackRead.push(stackWrite.pop());

}

return stackRead.peek();

}

/** Returns whether the queue is empty. */

public boolean empty() {

return stackRead.isEmpty() && stackWrite.isEmpty();

}

}

/**

  • Your MyQueue object will be instantiated and called as such:

  • MyQueue obj = new MyQueue();

  • obj.push(x);

  • int param_2 = obj.pop();

  • int param_3 = obj.peek();

  • boolean param_4 = obj.empty();

*/

Q3.5 栈排序

栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。

示例1:

输入:

[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]

[[], [1], [2], [], [], []]

输出:

[null,null,null,1,null,2]

示例2:

输入:

[“SortedStack”, “pop”, “pop”, “push”, “pop”, “isEmpty”]

[[], [], [], [1], [], []]

输出:

[null,null,null,null,null,true]

class SortedStack {

Stack p=new Stack<>();

Stack q=new Stack<>();

public SortedStack() {

}

public void push(int val) {

if(p.empty()) p.push(val);

else{

while(!p.empty()&&p.lastElement()<=val){

q.push(p.lastElement());

p.pop();

}

p.push(val);

while(!q.empty()){

p.push(q.lastElement());

q.pop();

}

}

}

public void pop() {

if(!p.empty()) p.pop();

}

public int peek() {

return p.empty()?-1:p.lastElement();

}

public boolean isEmpty() {

return p.empty();

}

}

Q3.6 动物收容所

动物收容所。有家动物收容所只收容狗与猫,且严格遵守“先进先出”的原则。在收养该收容所的动物时,收养人只能收养所有动物中“最老”(由其进入收容所的时间长短而定)的动物,或者可以挑选猫或狗(同时必须收养此类动物中“最老”的)。换言之,收养人不能自由挑选想收养的对象。请创建适用于这个系统的数据结构,实现各种操作方法,比如enqueue、dequeueAny、dequeueDog和dequeueCat。允许使用Java内置的LinkedList数据结构。

enqueue方法有一个animal参数,animal[0]代表动物编号,animal[1]代表动物种类,其中 0 代表猫,1 代表狗。

dequeue*方法返回一个列表[动物编号, 动物种类],若没有可以收养的动物,则返回[-1,-1]。

示例1:

输入:

[“AnimalShelf”, “enqueue”, “enqueue”, “dequeueCat”, “dequeueDog”, “dequeueAny”]

[[], [[0, 0]], [[1, 0]], [], [], []]

输出:

[null,null,null,[0,0],[-1,-1],[1,0]]

示例2:

输入:

[“AnimalShelf”, “enqueue”, “enqueue”, “enqueue”, “dequeueDog”, “dequeueCat”, “dequeueAny”]

[[], [[0, 0]], [[1, 0]], [[2, 1]], [], [], []]

输出:

[null,null,null,null,[2,1],[0,0],[1,0]]

class AnimalShelf {

Queue<int[]> dogs;

Queue<int[]> cats;

private static final int[] defaultans = {-1, -1};

public AnimalShelf() {

dogs = new LinkedList<>();

cats = new LinkedList<>();

}

public void enqueue(int[] animal) {

if(animal[1] == 0){

cats.offer(animal);

}else{

dogs.offer(animal);

}

}

public int[] dequeueAny() {

if(cats.isEmpty() && dogs.isEmpty()){

return defaultans;

}else{

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

设计模式学习笔记

设计模式系列学习视频

PPc7W-1711189395978)]
[外链图片转存中…(img-Dk5FXOrp-1711189395980)]
[外链图片转存中…(img-YMk61z9U-1711189395981)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-V3SRaaKB-1711189395981)]

设计模式学习笔记

[外链图片转存中…(img-BW3KPBQI-1711189395982)]

设计模式系列学习视频

[外链图片转存中…(img-iLuh3HNW-1711189395982)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值