代码随想录刷题笔记(DAY 10)

news2024/11/19 19:22:41

今日总结:快要期末考试了,现在在疯狂速成,今天稍微缓和了一点,应该能保证继续每天刷题,欠下的那些寒假补上。

Day 10

01. 用栈实现队列(No. 232)

题目链接

代码随想录题解

1.1 题目

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

输入:
[“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

提示:

  • 1 <= x <= 9
  • 最多调用 100pushpoppeekempty
  • 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
1.2 笔记

非常经典的题目,考察了对这两个数据结构的理解。栈实现了“先进后出”而队列则是“先进先出”,所以如果我们想要借助栈来实现队列的话,很容易就想到我们在输出的时候将栈中的数据反转即可,那反转如何实现呢?

这就需要用到两个栈:

在这里插入图片描述

即将 Stack1 视作一个 中转站,当我们需要输出的时候,就将 Stack1 中的元素 pop()Stack2 中,然后从 Stack2 中取元素。

注意 push() 的时候要判断 Stack2 是否为空,如果不为空就会出现顺序问题,因为此时的 Stack2 中即将弹出的第一个元素是我们构造的队列的第一个元素,如果我们在 Stack2 还未空的时候就 push() 新元素进来,就打破了确定的顺序。

1.3 代码
class MyQueue {
    Stack<Integer> s1;
    Stack<Integer> s2;

    public MyQueue() {
        // 初始化
        s1 = new Stack<>();
        s2 = new Stack<>();
    }

    public void push(int x) {
        // 每次放入新元素的时候都暂存到 s1
        s1.push(x);
    }

    public int pop() {
        if (s2.empty()) {
            while (!s1.empty()) {
                s2.push(s1.pop());
            }
        }
        return s2.pop();
    }

    public int peek() {
        // 判断 s2 是否为空
        if (s2.empty()) {
            while (!s1.empty()) {
                s2.push(s1.pop());
            }
        }
        return s2.peek();
    }

    public boolean empty() {
        return s1.empty() && s2.empty();
    }
}

02. 用队列实现栈

题目链接

代码随想录题解

2.1 题目

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsizeis empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多调用100pushpoptopempty
  • 每次调用 poptop 都保证栈不为空
2.2 笔记

有了上面那道题的经验,很多朋友拿到这道题就想着想上面那道题一样倒过来就行了,那怎样倒过来呢?

简单,在创建一个队列然后从第一个队列推入就行了。

但是提交发现题目还是错了,这是为什么呢?

队列是先进先出的数据结构,我们把一个队列一个个取出放入另一个队列,顺序是不会改变的,就像正数乘以一个整数还是整数,栈能够倒置原因就是它是先进后出,负数乘以负数结果就是正数,这样类比起来就比较好理解。

这道题目可以使用一个队列来实现,队列的队尾元素是栈的栈顶元素:

那如果想要删除这个队尾的元素,我们可以从队头开始遍历,然后将队头的元素依次放到队尾,直到最开始的队尾元素(栈顶)是队列的队头的时候停止,也就是需要遍历 size - 1 次,这时候将队头元素弹出得到的就是需要的元素了。

那如何获取队尾元素呢?

我们可以按照上面的方法循环 size- 1 然后得到队头的元素但不删除。但其实我们可以设置一个变量 lastNum 当我们需要队尾元素的时候就直接将这个返回。

如果没有删除元素的话那这个 lastNum 的值就很好确定,我们每次 add() 添加新元素的时候就将 lastNum 重置为这个值即可,那如果执行了删除的话,这时候原本的倒数第二个元素就成了新的 lastNum 我们只需要在遍历到倒数第二个元素的时候将其赋值即可。

2.3 代码
class MyStack {
    Queue<Integer> q1;
    int lastNum; // 记录最后一个元素的值

    public MyStack() {
        q1 = new ArrayDeque<>();
    }

    public void push(int x) {
        q1.add(x);
        lastNum = x;
    }

    public int pop() {
        int size = q1.size();
        size = size - 1;
        while (size-- > 0) {
            int temp = q1.remove(); // 记录此时弹出的元素
            q1.add(temp);
            // 当循环结束的时候就将其赋值成倒数第二个元素了,其实等价于 if (size == 0) {lastNum = temp; }
            lastNum = temp; 
        }
        return q1.remove();
    }

    public int top() {
        return lastNum;
    }

    public boolean empty() {
        return q1.isEmpty();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Deep Reinforment Learning Note 1

文章目录 Terminology Terminology st : stateot : observationat : action π θ ( a t ∣ o t ) \pi_\theta (a_t | o_t) πθ​(at​∣ot​) : policy π θ ( a t ∣ s t ) \pi_\theta (a_t | s_t) πθ​(at​∣st​) : policy (fully observed) Observation result from…

[软件工具]pdf多区域OCR识别导出excel工具使用教程

首先我们打开软件&#xff0c;界面如下&#xff1a; 如上图&#xff0c;使用非常简单&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;选择工具-取模板选择一个pdf文件划定自己需要识别的区域&#xff0c;如果你选择第2页指定区域则软件统一识别所有pdf第2页指定区…

线性表入门

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 从今天开始就进入到数据结构的部分了&#xff0c;整体分为3个部分&#xff1a;线性表&#xff0c;树和图&#xff0c;从认识每种数据结构到它们的高级应用。今天我们先…

如何从 Keras 中的深度学习目录加载大型数据集

一、说明 数据集读取&#xff0c;使用、在磁盘上存储和构建图像数据集有一些约定&#xff0c;以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…

Bom 和 Dom 区别 ----- 真是DOM 和 虚拟Dom区别

DOM和BOM的区别 我们都指代&#xff0c;javascript由三个部分组成&#xff1a; ECMAScript&#xff1a;描述了JS的语法和基本对象 BOM(浏览器对象)&#xff1a;与浏览器交互的方法和对象 DOM(文档对象模型)&#xff1a;处理网页内容的方法和接 ps&#xff1a;根据宿主&#x…

数学经典教材有什么?

有本书叫做《自然哲学的数学原理》&#xff0c;是牛顿写的&#xff0c;读完之后你就会感叹牛顿的厉害之处! 原文完整版PDF&#xff1a;https://pan.quark.cn/s/5d5eac2e56af 那玩意真的是人写出来的么… 现代教材把牛顿力学简化成三定律&#xff0c;当然觉得很简单。只有读了原…

并发前置知识一:线程基础

一、通用的线程生命周期&#xff1a;“五态模型” 二、java线程有哪几种状态&#xff1f; New&#xff1a;创建完线程Runable&#xff1a;start(),这里的Runnable包含操作的系统的Running&#xff08;运行状态&#xff09;和Ready&#xff08;上面的可运行状态&#xff09;Blo…

单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

目录 工作原理 在电机控制中的应用 脉宽调制&#xff08;PWM&#xff09;是一种在单片机中常用的控制技术&#xff0c;它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号&#xff0c;用于控制电机速度、亮度、电压等。 工作原理 …

2024,智能座舱不要再过度“装修”了!

文 | AUTO芯球 作者 | 雷慢 还记得2022年小鹏疲劳驾驶检测系统将小眼睛驾驶员识别为“开车睡觉”吗&#xff1f;驾驶员被扣了“智驾分”&#xff0c;你没听错&#xff0c;车主不光要焦虑驾照扣分的时候&#xff0c;还要焦虑被车子扣分。 雷慢还记得另一个奇葩事情是某问界车主…

S7-200SMART实例之冒泡法排序子程序

需求分析 编写程序实现冒泡法排序的算法。 冒泡法排序是一种简单的排序算法。因其过程如同水中气泡最终会上浮到水面一样&#xff0c;故被形象地称为“冒泡法排序”。 实现原理 根据以上需求分析可以按以下步骤实现算法&#xff1a; 1.比较相邻的元素。如果第一个比第二个…

linux 网络基础配置

将Linux主机接入到网络&#xff0c;需要配置网络相关设置一般包括如下内容&#xff1a; 主机名 iP/netmask (ip地址&#xff0c;网关) 路由&#xff1a;默认网关 网络连接状态 DNS服务器 &#xff08;主DNS服务器 次DNS服务器 第三个DNS服务器&#xff09; 一、…

多态、抽象类和接口(深拷贝和浅拷贝)

目录​​​​​​​ 前言&#xff1a; 多态&#xff1a; 多态的定义&#xff1a; 向上转型&#xff1a; 方法重写&#xff1a; 再看toString方法&#xff1a; 动态绑定&#xff1a; 向下转型&#xff1a; 小练习&#xff1a; 抽象类&#xff1a; 什么是抽象类&am…

自旋锁和互斥锁的区别

自旋锁和互斥锁的区别_自旋锁和互斥锁有什么区别?-CSDN博客

Fluids —— MicroSolvers DOP

目录 Gas SubStep —— 重复执行对应的子步 Switch Solver —— 切换解算器 Gas Attribute Swap —— 交换、复制或移动几何体属性 Gas Intermittent Solve —— 固定时间间隔计算子解算器 Gas External Forces —— 计算外部力并更新速度或速度场 Gas Particle Separate…

在Vivado下利用Tcl实现IP的高效管理

在Vivado下利用Tcl实现IP的高效管理https://cloud.tencent.com/developer/article/1736645 在Vivado下&#xff0c;有两种方式管理IP。一种是创建FPGA工程之后&#xff0c;在当前工程中选中IP Catalog&#xff0c;生成所需IP&#xff0c;这时相应的IP会被自动添加到当前工程中&…

FineBI实战项目一(18):每小时上架商品个数分析开发

点击新建组件&#xff0c;创建每小时上架商品个数组件。 选择线图&#xff0c;拖拽cnt&#xff08;总数&#xff09;到纵轴&#xff0c;拖拽hourStr到横轴。 修改横轴和纵轴的文字。 调节连线样式。 添加组件到仪表板。

vue知识-05

聊天室案例(django接口) # chat.hetm<<script src"/static/axios.js"></script><script src"/static/vue.js"></script><body> <div id"app"><h1>聊天室</h1><button click"handleS…

【无标题】用好Java 8的日期时间类

在 Java 8 之前&#xff0c;我们处理日期时间需求时&#xff0c;使用 Date、Calender 和 SimpleDateFormat&#xff0c;来声明时间戳、使用日历处理日期和格式化解析日期时间。但是&#xff0c;这些类的 API 的缺点比较明显&#xff0c;比如可读性差、易用性差、使用起来冗余繁…

竞赛保研 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

SpringBoot中使用LocalDateTime踩坑记录

文章目录 前言一、为什么推荐使用java.time包的LocalDateTime而不是java.util的Date&#xff1f;二、使用LocalDateTime和LocalDate时遇到了哪些坑&#xff1f;2.1 Redis序列化报错2.1.1 问题现象2.1.2 问题分析2.1.3 解决方案 2.2 LocalDateTime和LocalDate类型的属性返回给前…