【LeetCode-经典面试150题-day12】

20.有效的括号

题意:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

【输入样例】s="({})"

【输出样例】true

解题思路:

经典的栈思想,用数组模拟栈,从头开始遍历字符串,遇到左括号进栈,遇到右括号弹出栈顶,并匹配,看是否能匹配上,如果匹配不上直接return false;

class Solution {public boolean isValid(String s) {if(s.length() %2 ==1){//长度为奇数,肯定不匹配return false;}Map<Character,Character> map = new HashMap<Character,Character>();map.put(')','(');map.put('}','{');map.put(']','[');List<Character> stack = new ArrayList<>();for(int i=0;i<s.length();++i){if(!map.containsKey(s.charAt(i))){//左括号入栈stack.add(s.charAt(i));}else{//右括号要出栈匹配//栈为空或者栈顶元素与当前右括号不匹配if(stack.isEmpty() || map.get(s.charAt(i)) != stack.get(stack.size()-1)){return false;}//匹配上,要弹出栈顶元素stack.remove(stack.size()-1);}}return stack.isEmpty();}
}

时间: 击败了50.23%

内存: 击败了28.36%

71.简化路径

题意:

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/' 。
  • 最后一个目录名(如果存在)不能 以 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径 。

【输入样例】path="/home/"

【输出样例】"/home"

解题思路:

1. 根据‘/’将给定字符串进行分割,分割之后有三种情况:空字符串,一个点(.)和两个点(..);

2.遍历分割的字符串,将目录名存入到栈中。

遇到空字符串跳过,因为空字符串是由于多个/出现在一个;

3. 遇到'.'不处理,表示当前目录本身

4. 遇到'..‘弹出栈顶目录,切换到上一级

class Solution {public String simplifyPath(String path) {String[] splitPath = path.split("/");List<String> stack = new ArrayList<>();for(String current:splitPath){if("..".equals(current)){//出栈,切换到上一级目录,要不为空if(!stack.isEmpty()){stack.remove(stack.size()-1);}}else if(current.length() > 0 && !".".equals(current)){//当前的字符串长度大于0,表示不是空字符串,当前的字符也不是·,进栈stack.add(current);}}//拼接,空的时候也要返回一个/StringBuffer result = new StringBuffer();if(stack.isEmpty()){result.append("/");}else{//不为空,一直读出,直到空int n = 0;while(n<stack.size()){result.append("/");result.append(stack.get(n));++n;}}return result.toString();}
}

时间: 击败了94.43%

内存: 击败了77.54%

 155.最小栈

题意:

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

【输入样例】

["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

【输出样例】

[null,null,null,null,-3,null,0,-2]

解题思路:

这道题目初看,嗯好像没啥难点,其实最主要的是在获取最小值这个函数的实现;

刚拿到的时候,想着我就定义一个全局变量min,然后每次push的时候进行比较,这样就可以存储到最小的值了。但是,忽略了出栈的时候,保存的最小值可能会被弹出,这个时候,min怎么更新呢?

正确的做法是新开一个额外的栈,存储栈在剩余k个数据时的最小值;

1.minStack先存Integer.MAX_VALUE;

2.stack执行push操作的时候,minStack也要存储此时的最小值,Math.min(minStack.peek(), val);

3. stack执行pop操作的时候,minStack也要执行pop操作,这样才能做到一致。

class MinStack {Deque<Integer> stack;Deque<Integer> minStack;public MinStack() {stack = new LinkedList<Integer>(); minStack = new LinkedList<Integer>(); minStack.push(Integer.MAX_VALUE);}public void push(int val) {stack.push(val);minStack.push(Math.min(minStack.peek(), val));}public void pop() {stack.pop();minStack.pop();}public int top() {return stack.peek();}public int getMin() { return minStack.peek();}
}

时间: 击败了95.54%

内存: 击败了48.09%

 150.逆波兰表达式求值

题意:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示

【输入样例】token=["2","1","+","3","*"]

【输出样例】9    (2+1)*3=9

解题思路:

逆波兰表达式,也叫后缀表达式,就是运算符在两个运算数后面,ab* --> a*b

1. 用栈实现,遇到是运算数,进栈

2. 遇到操作符+-*/ 的时候,弹出栈顶和次栈顶的值,注意,运算的顺序是 次栈顶 操作符 栈顶;计算完结果后要将计算结果存入栈中;

class Solution {public int evalRPN(String[] tokens) {Deque<Integer> num = new LinkedList<Integer>();int a,b,temp;for(String str : tokens){//注意,存入数据的时候,将其转成int形。方便计算if(isNumber(str)){num.push(Integer.parseInt(str));}else{b = num.pop();a = num.pop();switch(str){case "+":num.push(a+b);break;case "-":num.push(a-b);break;case "*":num.push(a*b);break;case "/":num.push(a/b);break;}}}return num.peek();}public boolean isNumber(String str){return !("+".equals(str) ||"-".equals(str) ||"*".equals(str) ||"/".equals(str));}
}

时间: 击败了92.77%

内存: 击败了79.78%

 

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

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

相关文章

共享休闲娱乐空间:打造多元化生活方式

共享茶室&#xff1a; 共享茶室为人们提供了一个安静、放松的环境&#xff0c;让人们可以品尝不同种类的茶叶&#xff0c;并享受到与他人分享茶文化的乐趣。共享茶室通常会提供专业的泡茶设备和茶具&#xff0c;让人们可以更好地体验泡茶的过程和仪式感。这种共享空间不仅让人们…

Go的标准库Context理解

作为一个才入门的菜鸟&#xff0c;还没写过真正的 go 项目&#xff0c;要理解这个 Context 还是有点难&#xff0c;不过还是要尝试一下。在 Go http包的Server中&#xff0c;每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端…

会计术语英汉对照表 (包括术语详细介绍) | 会计英语

对账&#xff08;checking&#xff09; 对应账户&#xff08;corresponding accounts&#xff09; 定期清查&#xff08;Periodic ckecking method&#xff09; 定期盘存制&#xff08;periodic inventory system&#xff09; 订本式账簿&#xff08;bound book&#x…

【微服务】微服务调用原理及服务治理

本文通过图文结合&#xff0c;简要讲述微服务的调用原理&#xff0c;以及服务治理的相关概念。 1.微服务的调用原理 举个栗子&#xff1a;你去会所洗脚。首先&#xff0c;技师肯定要先去会所应聘&#xff0c;通过之后&#xff0c;会所会记录该技师的信息和技能&#xff0c;然后…

PHP反序列化 字符串逃逸

前言 最近在打西电的新生赛&#xff0c;有道反序列化的题卡了很久&#xff0c;今天在NSS上刷题的时候突然想到做法&#xff0c;就是利用字符串逃逸去改变题目锁死的值&#xff0c;从而实现绕过 为了研究反序列化的字符串逃逸 我们先简单的测试下 原理 <?php class escape…

带你了解SpringBoot---开启Durid 监控

文章目录 数据库操作--开启Durid 监控整合Druid 到Spring-Boot官方文档基本介绍Durid 基本使用代码实现 Durid 监控功能-SQL 监控需求:SQL 监控数据SQL 监控数据-测试页面 Durid 监控功能-Web 关联监控需求:Web 关联监控配置-Web 应用、URI 监控重启项目 Durid 监控功能-SQL 防…

SOA通信中间件常用的通信协议

摘要&#xff1a; SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。 前言 SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。模块化可以提高软件系统的可维护性和代码重用性&#xff0c;并且能够隔离故障。举例来说&#xff0c;…

【解决方案】VS Code无法导入自定义包

【解决方案】VS Code无法导入自定义包 解决方案&#xff1a; 在项目根目录新建import_func.py&#xff0c;并输入一下内容&#xff1a; import os import re import sys def import_all():sys_file []wd os.getcwd()sys_file.append(wd)for root, dirs, files in os.walk(w…

大语言模型微调实践——LoRA 微调细节

1. 引言 近年来人工智能领域不断进步&#xff0c;大语言模型的崛起引领了自然语言处理的革命。这些参数量巨大的预训练模型&#xff0c;凭借其在大规模数据上学习到的丰富语言表示&#xff0c;为我们带来了前所未有的文本理解和生成能力。然而&#xff0c;要使这些通用模型在特…

ubuntu修改默认文件权限umask

最近在使用ubuntu的过程中发现一个问题&#xff1a; 环境是AWS EC2&#xff0c;登录用户ubuntu&#xff0c;系统默认的umask是027&#xff0c;修改/etc/profile文件中umask 027为022后&#xff0c;发现从ubuntu用户sudo su过去root用户登录查询到的umask还是027&#xff0c;而…

LeetCode 面试题 01.07. 旋转矩阵

文章目录 一、题目二、C# 题解 一、题目 给你一幅由 N N 矩阵表示的图像&#xff0c;其中每个像素的大小为 4 字节。请你设计一种算法&#xff0c;将图像旋转 90 度。 不占用额外内存空间能否做到&#xff1f; 点击此处跳转题目。 示例 1: 给定 matrix [ [1,2,3], [4,5,6], …

直播系统源码协议探索篇(二):网络套接字协议WebSocket

上一篇我们分析了直播平台的会话初始化协议SIP&#xff0c;他关乎着直播平台的实时通信和多方互动技术的实现&#xff0c;今天我们来讲另一个协议&#xff0c;叫网络套接字协议WebSocket&#xff0c;WebSocket基于TCP在客户端与服务器建立双向通信的网络协议&#xff0c;并且可…

Mysql的多表查询和索引

MySQL 多表查询 当两个表查询时&#xff0c;从第一张表中取出一行和第二张表的每一行进行组合 返回结果含有两张表的所有列&#xff0c;一共返回的记录数第一张表行数*第二张表的行数&#xff08;笛卡尔积&#xff09; -- ?显示雇员名,雇员工资及所在部门的名字 【笛卡尔集…

Redis性能测试实操记录与分析

最近要查看redis的存储相关信息&#xff0c;这里做记录&#xff0c;分享下&#xff1a; 标题&#xff1a;Redis性能测试实操记录与分析 引言&#xff1a; Redis作为一种高速数据存储和缓存解决方案&#xff0c;被广泛应用于各种场景中。为了评估Redis在实际应用中的性能表现…

基于swing的小区物业管理系统java jsp社区报修信息mysql源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 基于swing的小区物业管理系统 系统有1权限&#xff1…

跨境出海:如何轻松应对多账号管理

在如今的跨境电商时代&#xff0c;成功经营一个线上店铺不再仅仅需要商品和服务&#xff0c;还需要精通广告投放、营销策略等多个领域。 然而&#xff0c;老练的电商从业者知道&#xff0c;如果不重视平台账号的管理方法&#xff0c;可能会导致店铺或营销账号被关联&#xff0…

Java面向对象三大特性之多态及综合练习

1.1 多态的形式 多态是继封装、继承之后&#xff0c;面向对象的第三大特性。 多态是出现在继承或者实现关系中的。 多态体现的格式&#xff1a; 父类类型 变量名 new 子类/实现类构造器; 变量名.方法名(); 多态的前提&#xff1a;有继承关系&#xff0c;子类对象是可以赋…

【FAQ】视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

Linux问题--docker启动mysql时提示3306端口被占用

问题描述&#xff1a; 解决方法&#xff1a; 1.如果需要kill掉mysqld服务可以先通过 lsof -i :3306 2. 查询到占用3306的PID&#xff0c;随后使用 kill -15 PID 来kill掉mysqld服务。 最后结果

前端通信(渲染、http、缓存、异步、跨域)自用笔记

SSR/CSR&#xff1a;HTML拼接&#xff1f;网页源码&#xff1f;SEO/交互性 SSR &#xff08;server side render&#xff09;服务端渲染&#xff0c;是指由服务侧&#xff08;server side&#xff09;完成页面的DOM结构拼接&#xff0c;然后发送到浏览器&#xff0c;为其绑定状…