给自己复盘用的随想录笔记-栈与队列
用栈实现队列
难在出去
232. 用栈实现队列 - 力扣(LeetCode)
class MyQueue {private Stack<Integer> A;private Stack<Integer> B;public MyQueue() {A=new Stack<>();B=new Stack<>();}public void push(int x) {A.push(x);}public int pop() {int peek=peek();B.pop();return peek;}public int peek() {if(!B.isEmpty()) return B.peek();if(A.isEmpty()) return -1;while(!A.isEmpty()){B.push(A.pop());}return B.peek();}public boolean empty() {return A.isEmpty()&&B.isEmpty();}
}
用队列实现栈
难在进入
225. 用队列实现栈 - 力扣(LeetCode)
class MyStack {Queue<Integer> A;Queue<Integer> B;public MyStack() {A=new LinkedList<Integer>();B=new LinkedList<Integer>();}public void push(int x) {B.offer(x);while(!A.isEmpty()){B.offer(A.poll());}Queue<Integer> C=A;A=B;B=C;}public int pop() {return A.poll();}public int top() {return A.peek();}public boolean empty() {return A.isEmpty();}
}
1.
在Java中,Queue 是一个接口,而 LinkedList 是实现了 Queue 接口的一个具体类。
所以
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
这点和前面的栈不同
2.
栈和队列的方法
这里是 Queue 和 Stack 接口中一些常用方法的对比:
Queue 接口:
boolean offer(E e): 将元素插入队列,如果成功则返回 true,如果队列满则返回 false。
E poll(): 移除并返回队列头部的元素,如果队列为空则返回 null。
E remove(): 移除并返回队列头部的元素,如果队列为空则抛出 NoSuchElementException。
peek()
在Java中,peek() 方法是 Queue 接口的一部分,它用于获取队列头部的元素,但不从队列中移除它。这个方法通常用于查看队列的第一个元素而不改变队列的状态。
Stack 接口 (继承自 Vector 类):
E push(E item): 将元素压入栈顶。
E pop(): 移除并返回栈顶元素。
E peek(): 返回栈顶元素,但不移除它。
有效的括号
!!!!!!
这个题目看了好久,还是迷糊
特别是对占位符?的理解
例如出现
())的情况的时候,如果没有占位符在栈中,就是报出异常
20. 有效的括号 - 力扣(LeetCode)
class Solution {private static final Map<Character,Character> map = new HashMap<Character,Character>(){{put('{','}'); put('[',']'); put('(',')'); put('?','?');}};public boolean isValid(String s) {if(s.length() > 0 && !map.containsKey(s.charAt(0))) return false;LinkedList<Character> stack = new LinkedList<Character>() {{ add('?'); }};for(Character c : s.toCharArray()){if(map.containsKey(c)) stack.addLast(c);else if(map.get(stack.removeLast()) != c) return false;}return stack.size() == 1;}
}
20. 有效的括号 - 力扣(LeetCode)
这个题解没有用到?占位符
解法一
class Solution {public boolean isValid(String s) {if(s.length()%2!=0){return false;}Map<Character,Character> map=new HashMap<>();map.put('(',')');map.put('{','}');map.put('[',']');LinkedList<Character> stack=new LinkedList<Character>();for(char c:s.toCharArray()){if(map.containsKey(c)) stack.add(map.get(c));else if(stack.isEmpty()||stack.removeLast()!=c)return false;}return stack.isEmpty();}
}
解法二
class Solution {public boolean isValid(String s) {if(s.length()%2!=0){return false;}Map<Character,Character> map=new HashMap<>();map.put(')','(');map.put('}','{');map.put(']','[');LinkedList<Character> stack=new LinkedList<Character>();for(char c:s.toCharArray()){if(!map.containsKey(c)) stack.add(c);else if(stack.isEmpty()||stack.removeLast()!=map.get(c))return false;}return stack.isEmpty();}
}
总结:其实不管map里面谁是键,谁是值,对于栈的思路就是先入栈再出栈,因为出现左括号才会入栈,因为出现右括号才会出栈!
坚持这个思路
删除字符串中所有的相邻重复项
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
class Solution{public String removeDuplicates(String s) {StringBuilder str=new StringBuilder();for(char c:s.toCharArray()){if(str.length()!=0&&str.charAt(str.length()-1)==c){str.deleteCharAt(str.length()-1);}else{str.append(c);}}return str.toString();}
}
1.
StringBuffer 是 Java 中的一个类,它代表了一个可变的字符序列。虽然它的名字中有 "Buffer" 这个词,但它并不是一个栈结构。StringBuffer 提供了线程安全的操作,可以被多个线程同时使用而不会出现线程安全问题。
StringBuffer 的底层结构实际上是一个可变大小的字符数组,它提供了多种方法来操作这个字符数组,比如 append、insert、delete、replace 等。这些方法允许你在 StringBuffer 对象中添加、插入、删除或替换字符。
2.
StringBuilder 是 Java 中的一个类,它用于创建可变的字符串。与 StringBuffer 类似,StringBuilder 也提供了一个可变大小的字符序列,允许你通过各种方法来修改字符串,如 append、insert、delete、replace 等。
不过,与 StringBuffer 的主要区别在于 StringBuilder 不是线程安全的。这意味着它在单线程环境中性能更好,因为它不需要处理同步操作。如果你确定你的代码只会在单线程环境中使用,或者你可以自己管理同步,那么 StringBuilder 通常是更好的选择。
StringBuilder 的底层结构也是一个可变大小的字符数组,但它不像 StringBuffer 那样提供线程安全的保证。在多线程环境中使用 StringBuilder 可能会导致不可预知的结果,因为多个线程可能会同时修改同一个 StringBuilder 实例。
所以本题目中用哪一个都一样
逆波兰表达式求值
这个题目就是看着吓人
150. 逆波兰表达式求值 - 力扣(LeetCode)
class Solution {public int evalRPN(String[] tokens) {Stack<Integer> num=new Stack<>();Integer p1,p2;for(String c:tokens){switch(c){case "+":p2=num.pop();p1=num.pop();num.push(p1+p2);break;case "-":p2=num.pop();p1=num.pop();num.push(p1-p2);break; case "*":p2=num.pop();p1=num.pop();num.push(p1*p2);break; case "/":p2=num.pop();p1=num.pop();num.push(p1/p2);break; default:num.push(Integer.valueOf(c));break;}}return num.pop();}
}
最小栈
155. 最小栈 - 力扣(LeetCode)
class MinStack {Stack<Integer> stack;Stack<Integer> min_stack;public MinStack() {stack=new Stack<>();min_stack=new Stack<>();}public void push(int val) {stack.push(val);if(min_stack.isEmpty()|| min_stack.peek()>=val){min_stack.push(val);}}public void pop() {if(stack.pop().equals(min_stack.peek())){min_stack.pop();}}public int top() {return stack.peek();}public int getMin() {
return min_stack.peek();}
}
滑动窗口最大值
队列和双指针问题结合到一起
239. 滑动窗口最大值 - 力扣(LeetCode)
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length==0 ||k==0)
return new int[0];
int[] res=new int[nums.length-k+1];
Deque<Integer> deque=new LinkedList<>();
for(int l=1-k,r=0;r<nums.length;l++,r++){if(l>0&&deque.peekFirst()==nums[l-1])
deque.removeFirst();while(!deque.isEmpty()&&deque.peekLast()<nums[r])
deque.removeLast();deque.addLast(nums[r]);if(l>=0){res[l]=deque.peekFirst();
}
}
return res;}
}
前K个高频元素
347. 前 K 个高频元素 - 力扣(LeetCode)
看这个题解的思路,不用看代码,代码和代码注释都有问题
class Solution {public int[] topKFrequent(int[] nums, int k) {// 使用字典,统计每个元素出现的次数,元素为键,元素出现的次数为值HashMap<Integer,Integer> map = new HashMap();for(int num : nums){map.put(num,map.getOrDefault(num,0) + 1);}// 遍历map,用大根保存频率最大的k个元素PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return map.get(a) - map.get(b);}});for (Integer key : map.keySet()) {if (pq.size() < k) {pq.add(key);} else if (map.get(key) > map.get(pq.peek())) {pq.remove();pq.add(key);}}// 取出大根堆中的元素int[] res=new int[k];int index=0;while (!pq.isEmpty()) {res[index++]=pq.remove();}return res;}
}
相关文章:
给自己复盘用的随想录笔记-栈与队列
用栈实现队列 难在出去 232. 用栈实现队列 - 力扣(LeetCode) class MyQueue {private Stack<Integer> A;private Stack<Integer> B;public MyQueue() {Anew Stack<>();Bnew Stack<>();}public void push(int x) {A.push(x);}pu…...
微信小程序跳转到另一个微信小程序
引用:http://www.xmdeal.com/mobanjiaocheng/254.html 第一种方法: wx.navigateToMiniProgram 官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html wx.navigateToMiniProgram({appId…...

【知识图谱】4、LLM大模型结合neo4j图数据库实现AI问答的功能
昨天写了一篇文章,使用fastapi直接操作neo4j图数据库插入数据的例子, 本文实现LLM大模型结合neo4j图数据库实现AI问答功能。 废话不多说,先上代码 import gradio as gr from fastapi import FastAPI, HTTPException, Request from pydantic…...

《信息技术 云计算 边缘云通用技术要求》国家标准发布,九州未来参编
日前,2024年第17号国家标准公告发布,由全国信标委云计算标准工作组组织制定、九州未来作为行业专家单位参编的《信息技术 云计算 边缘云通用技术要求》国家标准正式获批发布。 边缘云作为云计算技术的有效补充和拓展,能够实现将云计算能力拓展…...

NTFS硬盘支持工具Paragon NTFS for Mac 15.4.44 中文破解版
Paragon NTFS for Mac 15.4.44 中文破解版是一个底层的文件系统驱动程序,专门开发用来弥合Windows和Mac OS X之间的不兼容性,通过在Mac OS X系统下提供对任何版本的NTFS文件系统完全的读写访问服务来弥合这种不兼容性。为您轻松解决Mac不能识别Windows NTFS文件难题…...
66-java 类型擦除
类型擦除是Java类型信息在运行时的一个特性,它发生在泛型类型被擦除成它们的原始类型后,以及在运行时,由于类型擦除,泛型信息不可用。 例如,以下两个泛型类型: List<String> list1 new ArrayList&…...

25考研人数预计下降?这一届考研有哪些新趋势?
2025年考研时间线: 2024年9月:公共课及各院校考试大纲公布; 2024年9月下旬:预报名; 2024年10月:正式报名; 2024年11月:线上/线下确认; 2024年12月中下旬:…...

比尔·盖茨对AI充满信心
The Verge与比尔盖茨进行了关于AI、错误信息和气候变化的对话。 比尔盖茨花费数十亿美元资助他认为将塑造未来的技术——从应对气候变化到消灭疾病。 盖茨在一部新的Netflix系列片《未来之路:比尔盖茨的境界》中深入探讨了这些话题。该系列于9月18日首播ÿ…...

Selenium 实现图片验证码识别
前言 在测试过程中,有的时候登录需要输入图片验证码。这时候使用Selenium进行自动化测试,怎么做图片验证码识别?本篇内容主要介绍使用Selenium、BufferedImage、Tesseract进行图片 验证码识别。 环境准备 jdk:1.8 tessdata&…...

基于云原生向量数据库 PieCloudVector 的 RAG 实践
近年来,人工智能生成内容(AIGC)已然成为最热门的话题之一。工业界出现了各种内容生成工具,能够跨多种模态产生多样化的内容。这些主流的模型能够取得卓越表现,归功于创新的算法、模型规模的大幅扩展,以及海…...
内存泄漏的影响
(1)内存泄漏是什么? 内存泄漏是指程序运行过程中分配的内存没有被正确释放,导致这部分内存无法再次使用,从而造成内存资源的浪费。内存泄漏可能会导致系统性能下降、程序崩溃或者消耗过多的系统资源;内存泄漏通常发生在动态分配的…...
shell变量扩展你知道多少?
1. shell变量扩展 我们知道,${var}的形式可以获取变量var的值,但其实还可以有更多花式玩法。其中~表示用户根目录其实属于 波浪线扩展,这比较常见,不展开介绍了。 下面的每种情况中,word 都要经过波浪线扩…...
Compose中对于KeyEvent的处理
在开发Android TV时,遇到了一个需求,需要对遥控器发出的上下左右按键点击事件做处理。此处我们可以在Modifier.onKeyEvent中对按键事件做处理。此处我写了一个按钮的modifier模板如下。 private val buttonModifier Modifier.onKeyEvent {when {KeyEve…...
OpenXR Monado compositor处理应用layers(cheduled->delivered)
OpenXR Monado compositor处理应用的layer,scheduled->delivered @src/xrt/targets/common/target_instance.c t_instance_create_system @src/xrt/compositor/main/comp_compositor.ccomp_main_create_system_compositor@src/xrt/compositor/multi/comp_multi_system…...
leetcode:1137 Tribonacci 数列
1137 Tribonacci 数列 题目链接https://leetcode.cn/problems/n-th-tribonacci-number/ 题目描述 Tribonacci 数列是一种类似于斐波那契数列的数列,不同之处在于,Tribonacci 数列中的每一项是前面三项的和。给定整数 n,求出 Tribonacci 数…...
简单讲一下API的作用以及介绍
API全称Application Programming Interface,即应用程序编程接口,是一些预先定义的函数,或指软件系统不同组成部分衔接的约定,用于传输数据和指令,使应用程序之间可以集成和共享数据资源。 API 接口简介 一、基本概念…...

猎板道出PCB免费打样真相:制造成本究竟给了谁?
猎板PCB作为电路板特殊定制的厂家,曾经推出了PCB免费打样活动以吸引新客户。从经营的角度来看,免费打样的成本实际上最终由稳定客户承担。免费打样的客户往往仅在有免费机会时下单,而稳定的合作客户则为这些促销活动买单。这种模式长期下来可…...

Linux 竞争与并发(学习总结)
在Linux驱动开发中,“并发”和“竞争”是两个重要的概念,它们涉及到多任务环境下资源的管理和使用。 并发 (Concurrency) 并发指的是在同一时间段内,多个任务看似同时运行的现象。实际上,在单核处理器上,这通常是通过…...
SaaS初创企业需求建模指南
所以你已经准备好进入市场,你有宏大的目标,并且充满激情。 但等等。 你要如何 实现 这些目标呢? 你设置了 正确的 目标吗? 而且你的目标是 可实现的吗? 那么,如何回答这些问题呢? 进入需求…...
MySQL最左匹配原则
MySQL索引的加左原则,也被称为最左匹配原则(Leftmost Prefix Rule)或最左前缀规则(Leftmost Prefixes),是指在创建复合索引时,应将经常用于查询的列放在索引的最左边,以便MySQL能够更…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...