【java】【python】leetcode刷题记录--栈与队列
232 用栈实现队列
题目描述
两个栈模拟队列的思路是利用栈(后进先出结构)的特性来实现队列(先进先出结构)的行为。这种方法依赖于两个栈来逆转元素的入队和出队顺序,从而实现队列的功能。
入队操作(使用stackIn):所有新加入的元素都直接推入stackIn。因为栈支持后进先出,所以此时不需要考虑元素的顺序。
出队操作(使用stackOut):当需要进行出队操作(即移除队列的最前端元素)时,我们先检查stackOut:如果stackOut为空,则将stackIn中所有元素逐一弹出并推入stackOut。这样,最先进入stackIn的元素(也就是最早入队的元素)会位于stackOut的顶部。如果stackOut不为空,则直接从stackOut弹出顶部元素(队列的前端元素)。
通过这种方式,stackOut的栈顶始终保持为队列的最前端,而stackIn用于处理新的入队操作。
class MyQueue {Stack<Integer> stackIn;Stack<Integer> stackOut;public MyQueue() {stackIn = new Stack<>();stackOut = new Stack<>();}public void push(int x) {stackIn.push(x);}public int pop() {// 将in栈的内容全部转移到out栈,从out栈进行输出// 如果out栈有内容就先输出if(stackOut.empty()){while(!stackIn.empty()){stackOut.push(stackIn.pop());}}return stackOut.pop();}public int peek() {if(stackOut.empty()){while(!stackIn.empty()){stackOut.push(stackIn.pop());}}return stackOut.peek();}public boolean empty() {return (stackIn.empty())&&(stackOut.empty());}
}/*** 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();*/
225 用队列实现栈
题目链接
这题也是利用两个队列来进行元素顺序的调整。
queue2是辅助队列,queue1存放进入栈的元素,当想要得到栈顶(队尾)元素,即把queue1的元素放入queue2,知道queue1只剩一个元素,该元素则为栈顶元素。将其弹出即可。剩余操作也是类似。
class MyStack {Queue<Integer> queue1;Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();}public void push(int x) {queue2.offer(x); // 先放在辅助队列中while (!queue1.isEmpty()){queue2.offer(queue1.poll());}Queue<Integer> queueTemp;queueTemp = queue1;queue1 = queue2;queue2 = queueTemp; // 最后交换queue1和queue2,将元素都放到queue1中}/** Removes the element on top of the stack and returns that element. */public int pop() {return queue1.poll(); // 因为queue1中的元素和栈中的保持一致,所以这个和下面两个的操作只看queue1即可}/** Get the top element. */public int top() {return queue1.peek();}/** Returns whether the stack is empty. */public boolean empty() {return queue1.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/
python版本:
from queue import Queueclass MyStack:def __init__(self):self.queue1 = Queue()def push(self, x):# 临时队列,用于转移元素temp_queue = Queue()temp_queue.put(x) # 先放入新元素(栈顶元素)# 将原队列中的元素转移到临时队列中,确保新元素始终在队列头部while not self.queue1.empty():temp_queue.put(self.queue1.get())self.queue1 = temp_queue # 更新队列为新的队列def pop(self):# 直接从 queue1 中取出元素,因为 queue1 的队头是栈顶return self.queue1.get()def top(self):# 获取队头元素即栈顶元素top_element = self.queue1.get()# 为保持队列状态,将该元素重新放回队头temp_queue = Queue()temp_queue.put(top_element)while not self.queue1.empty():temp_queue.put(self.queue1.get())self.queue1 = temp_queue # 更新队列return top_elementdef empty(self):# 如果 queue1 为空,则栈为空return self.queue1.empty()
20 有效的括号
题目描述
很经典的栈的题目。
如果遇到左括号则要入栈,遇到右括号则与栈顶的元素配对,配对失败则是false,反之继续配对。这里要特别注意,右括号来的适合左括号可能为空,这是false。或者最后左括号剩余,这也是false。
class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for(int i=0; i<s.length(); i++){char tmp = s.charAt(i);if (tmp == '(' || tmp == '{' || tmp == '[') {stack.push(tmp);} else {if (stack.empty()) return false; // 先检查栈是否为空char top = stack.pop(); // 弹出栈顶元素以匹配if (tmp == ')' && top != '(') return false;if (tmp == '}' && top != '{') return false;if (tmp == ']' && top != '[') return false;}}return stack.empty();}
}
python版本:
class Solution:def isValid(self, s: str) -> bool:stack = []for char in s:if char in '({[':stack.append(char)else:if not stack:return False # 检查栈是否为空top = stack.pop() # 弹出栈顶元素以匹配if char == ')' and top != '(':return Falseif char == '}' and top != '{':return Falseif char == ']' and top != '[':return Falsereturn not stack # 栈空则有效,非空则无效
当然,这题也可以用set(map)进行查找的优化,但意义不太大。比如如下代码:
import java.util.HashMap;
import java.util.Stack;public class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();HashMap<Character, Character> map = new HashMap<>();// 存储括号对应关系map.put(')', '(');map.put('}', '{');map.put(']', '[');for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 如果是右括号if (map.containsKey(c)) {// 栈为空或栈顶元素不匹配当前右括号对应的左括号if (stack.isEmpty() || stack.pop() != map.get(c)) {return false;}} else {// 否则为左括号,压入栈中stack.push(c);}}// 如果栈为空,说明所有括号都匹配成功return stack.isEmpty();}
}
1047 删除字符串中的所有相邻重复项
题目链接
第一眼还以为要双指针或者滑动窗口,但并不用,双指针往往是对数组/字符串/链表进行操作,滑动窗口则是找子序列/最大长度这种。
这题实际上就是栈的应用,没遇到一个新元素就入栈,如果栈顶元素与新的元素相同,则把栈顶元素出栈,以此类推。
关于java的StringBuider,看这篇:链接
class Solution {public String removeDuplicates(String s) {Stack<Character> stack = new Stack<>();for(int i=0; i<s.length(); i++){char tmp = s.charAt(i);if(!stack.isEmpty() && stack.peek()==tmp){stack.pop();}else{stack.push(tmp);}}StringBuilder res = new StringBuilder();for (char ch : stack) {res.append(ch);}return res.toString();}
}
python版本:join可以方便的把列表转换为字符串。如果不用join那会浪费一些时间。
class Solution:def removeDuplicates(self, s: str) -> str:stack = []for char in s:if stack and stack[-1] == char:stack.pop()else:stack.append(char)return ''.join(stack)#或者这样res = ''for c in stack:res = res + creturn res
150 逆波兰表达式求值
题目链接
题目很简单,如果了解后缀表达式很轻松能写出来,将数字存在栈中,遇到符号取出栈顶的2个元素计算,再将结果放回栈内即可。
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();for (String token : tokens) {if (token.equals("+") || token.equals("-") || token.equals("*") || token.equals("/")) {int b = stack.pop(); // 先弹出的是第二个操作数int a = stack.pop(); // 再弹出的是第一个操作数switch (token) {case "+":stack.push(a + b);break;case "-":stack.push(a - b);break;case "*":stack.push(a * b);break;case "/":stack.push(a / b);break;}} else {// 直接将字符串转换为整数并压栈stack.push(Integer.parseInt(token));}}// 最终栈顶元素就是表达式的结果return stack.peek();}
}
python版本:
class Solution:def evalRPN(self, tokens: List[str]) -> int:res = []print(int(6/(-132)))for token in tokens:if token not in {'+', '-', '*', '/'}:res.append(int(token))else:a = res.pop()b = res.pop()if token == '+':res.append(a+b)elif token == '-':res.append(b-a)elif token == '*':res.append(a*b)elif token == '/':res.append(int(b/a))return res[0]
在Python中,对于整数除法,/ 操作符执行的是真除法(返回浮点结果),而 // 操作符执行的是地板除(即对结果向下取整到最近的整数)。因此,当使用 / 并将结果强制转换为 int 时,它只是简单地去掉了小数部分,不进行四舍五入,而且对于负数结果也只是截断小数部分。而使用 //,则是在计算结果后直接返回一个整数,且结果总是向下取整,这种方式与C++和Java中的整数除法一致。
对于正数除法:
- 5 / 2 结果为 2.5,int(5 / 2) 结果为 2
- 5 // 2 结果为 2。
对于负数除法:
- -5 / 2 结果为 -2.5,int(-5 / 2) 结果为 -2。
- -5 // 2 结果为 -3,因为 -2.5 向下取整是 -3。
因此这里要使用转换为int,而不是//。
相关文章:
【java】【python】leetcode刷题记录--栈与队列
232 用栈实现队列 题目描述 两个栈模拟队列的思路是利用栈(后进先出结构)的特性来实现队列(先进先出结构)的行为。这种方法依赖于两个栈来逆转元素的入队和出队顺序,从而实现队列的功能。 入队操作(使用s…...
java并发常见问题
1.死锁:当两个或多个线程无限期地等待对方释放锁时发生死锁。为了避免这种情况,你应该尽量减少锁定资源的时间,按顺序获取锁,并使用定时锁尝试。 2.竞态条件:当程序的行为依赖于线程的执行顺序或输入数据到达的顺序时…...
联芸科技偏高的关联交易:业绩波动性明显,海康威视曾拥有一票否决
《港湾商业观察》施子夫 5月31日,上交所上市审核委员会将召开2024年第14次审议会议,届时将审议联芸科技(杭州)股份有限公司招股书(以下简称,联芸科技)的首发上会事项。 据悉,此次系…...
hexo init命令报错:Error: EPERM: operation not permitted, mkdir ‘D:\‘
我用的是git bash通过hexo init安装hexo的,但是报错如下: $ hexo init INFO Cloning hexo-starter https://github.com/hexojs/hexo-starter.git fatal: unable to access https://github.com/hexojs/hexo-starter.git/: HTTP/2 stream 1 was not clos…...
day-37 最大正方形
思路 动态规划,这题主要得弄明白状态转换方程,dp[i][j]表示以(i,j)为右下角的最大正方形 解题方法 1.首先将第一行和第一列初始化,当对应位置的matrix为’0’时,dp数组对应位置也为零,否则为1 …...
springboot 3.3版本 类数据共享(CDS)提升启动速度 使用方法+Docker打包代码
springboot 3.3 版本已经正式发布,新版本提供了类数据共享(CDS)功能,通过将类元数据缓存在 Archive(归档/存档) 文件中,使其可以快速预加载到新启动的 JVM 中,从而帮助缩短 JVM 的启…...
Django 目录
Django 创建项目及应用-CSDN博客 Django 注册应用-CSDN博客 Django 应用的路由访问-CSDN博客 Django templates 存放html目录-CSDN博客 Django 解析路由参数-CSDN博客 Django 用re_path()方法正则匹配复杂路由-CSDN博客 Django 反向解析路由-CSDN博客 Django HttpReques…...
VirtualBox Ubuntu系统硬盘扩容
1、关闭虚拟机,找到需要扩容的硬盘,修改为新的容量80GB,应用保存。 2、打开VM,进入系统,使用lsblk可以看到硬盘容量已经变为80GB,但硬盘根分区还没有扩容,使用df查看根文件系统也没有扩容。 [19…...
【自动驾驶】针对低速无人车的线控底盘技术
目录 术语定义 一般要求 操纵装置 防护等级 识别代号 技术要求 通过性要求 直线行驶稳定性 环境适应性要求 功能安全要求 信息安全要求 故障处理要求 通信接口 在线升级(OTA) 线控驱动 动力性能 驱动控制响应能力 线控制动 行车制动 制动响应能力 线控转向 总体要求 线控…...
Kotlin 继承和实现
文章目录 前言继承(extend)实现(implement)继承与实现 前言 在 Kotlin 中,继承和实现都是在类名后使用冒号:,后边加上其他类或接口的名称来表示,二者之间写法没有太大区别(类需要加…...
MATLAB误差估计扩展卡尔博斯方法的目录大纲
MATLAB误差估计扩展卡尔博斯方法的目录大纲 目录: 一、引言 1.1 背景介绍 1.2 研究意义 二、基本理论 2.1 误差估计的基本概念 2.2 卡尔博斯方法的基本原理 三、MATLAB误差估计扩展卡尔博斯方法 3.1 MATLAB简介 3.2 MATLAB在误差估计中的应用 3.3 MATLAB扩展卡尔…...
NetMizer 日志管理系统前台RCE漏洞
声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品介绍 NetMizer日志管理系统是一个与NetMizer流量管理设备配合…...
【spring】第二篇 bean实例化
对象已经能交给Spring的IOC容器来创建了,但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程,在这块内容中主要解决两部分内容,分别是 bean是如何创建的 实例化bean的三种方式,构造方法,静态工厂和实例工厂 在讲解这…...
MVC和MVVM
MVC Model层:用于处理应用程序数据逻辑的部分,通常负责在数据库中存取数据 View(视图)处理数据显示的部分。通常视图是依据模型数据创建的 Controller(控制器)是处理用户交互的部分。通常控制器负责从视…...
【康耐视国产案例】智能AI相机机器视觉精准快速实现包裹标签的智能粘贴
康耐视推出的3D-A1000是专业的、匹配物流行业各类分拣机及包裹检测应用的全功能视觉检测系统,其能够准确检测分拣机上是否有包裹、包裹是否超出边界、空车检测、是否有遗留物品等。由于搭载了专利的三维结构光技术,产品具有更强大的创新性以满足持续更新…...
发现真正的诉求
在不久前,我在负责一个项目,设计了一个方案。但是,与我一同合作的同事对其中的一个设计点持有异议。我们尝试讨论解决,但似乎没有找到共识。然而,尽管双方的观点没有达成一致,我们都清楚地表达了自己的想法…...
Spring Boot配置MySQL数据库连接数
1.如何在Spring Boot中配置MySQL数据库的连接数 1.1主要配置 在Spring Boot中配置MySQL数据库连接数通常涉及到两个主要的配置: (1)数据源配置:这通常是在application.properties或application.yml文件中完成的,用于…...
springboot595基于Java的大学生迎新系统-手把手调试搭建
springboot595基于Java的大学生迎新系统-手把手调试搭建 springboot595基于Java的大学生迎新系统-手把手调试搭建...
20 道大模型面试问题(含答案)
大型语言模型在生成式人工智能(GenAI)和人工智能(AI)中正变得越来越有价值。这些复杂的算法增强了人类的能力,并在各个领域促进了效率和创造力。 节前,我们组织了一场算法岗技术&面试讨论会࿰…...
【Java面试】四、MySQL篇(上)
文章目录 1、定位慢查询2、慢查询的原因分析3、索引3.1 数据结构选用:二叉树 & 红黑树3.2 数据结构选用:B树 4、聚簇索引、非聚簇索引、回表查询4.1 聚簇索引、非聚簇索引4.2 回表查询 5、覆盖索引、超大分页优化5.1 覆盖索引5.2 超大分页处理 6、索…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
