算法跟练第十弹——栈与队列

news/2025/2/15 12:16:58/

文章目录

  • part01 逆波兰表达式求值
  • part02 滑动窗口最大值
  • part03 前 K 个高频元素
  • 归纳:
    • 将字符串转转换成整数:
    • LinkedList
    • Map遍历
    • 优先级队列的比较器

跟着代码随想录刷题的第十天。

代码随想录链接:代码随想录

part01 逆波兰表达式求值

题目链接:150. 逆波兰表达式求值

代码:

class Solution {public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack<>();int num;int a;int b;for(String i:tokens){if(isInt(i)){num = Integer.parseInt(i);stack.push(num);}else{b = stack.pop();a = stack.pop();int result = cal(i,a,b);stack.push(result);}}return stack.pop();}public boolean isInt(String s){//用正则表达式String b = "^-?\\d+$";return s.matches(b);}public int cal(String s,int a,int b){int result;switch(s){case "+":result = a+b;break;case "-":result = a-b;break;case "*":result = a*b;break;default:result = a/b;}return result;}
}

题解:只要遇到符号,就弹出前两个数并且进行运算,再把运算的结果存进去

代码随想录的解法:

class Solution {public int evalRPN(String[] tokens) {Deque<Integer> stack = new LinkedList();for (String s : tokens) {if ("+".equals(s)) {        // leetcode 内置jdk的问题,不能使用==判断字符串是否相等stack.push(stack.pop() + stack.pop());      // 注意 - 和/ 需要特殊处理} else if ("-".equals(s)) {stack.push(-stack.pop() + stack.pop());} else if ("*".equals(s)) {stack.push(stack.pop() * stack.pop());} else if ("/".equals(s)) {int temp1 = stack.pop();int temp2 = stack.pop();stack.push(temp2 / temp1);} else {stack.push(Integer.valueOf(s));}}return stack.pop();}
}

对比了一下,我多了判断字符串数组里面的数是不是整数的步骤

part02 滑动窗口最大值

题目链接:239. 滑动窗口最大值

代码:

class MyQueue{Deque<Integer> queue = new LinkedList<>();public void poll(int val){if(!queue.isEmpty()&&val==queue.peek()){queue.poll();}}public void add(int val){while(!queue.isEmpty()&&val>queue.getLast()){queue.removeLast();}queue.add(val);}public int peek(){return queue.peek();}
}class Solution {public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length==1)return nums;MyQueue queue = new MyQueue();int len = nums.length-k+1;int[] result = new int[len];int cnt = 0;for(int i = 0;i<k;i++){queue.add(nums[i]);}result[cnt++] = queue.peek();for(int i = k;i<nums.length;i++){queue.poll(nums[i-k]);queue.add(nums[i]);result[cnt++] = queue.peek();}return result;}
}

题解:本题是自定义了一个单调队列,只在队列中保留可能成为最大值的数值。当一个数值进入到队列中时,若是前面所有值都比它小,就全部弹出。

part03 前 K 个高频元素

题目链接:347.前 K 个高频元素

代码:

class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer,Integer> map = new HashMap<>();for(int n:nums){map.put(n,map.getOrDefault(n,0)+1);}PriorityQueue<int[]> que = new PriorityQueue<>((pair1,pair2)->pair1[1]-pair2[1]);for(Map.Entry<Integer, Integer> entry : map.entrySet()){if(que.size()<k){que.add(new int[]{entry.getKey(),entry.getValue()});}if(que.size()<k){que.poll();que.add(new int[]{entry.getKey(),entry.getValue()});}}int[] ans = new int[k];for(int i= k-1;i>=0;i--){ans[i] = que.poll()[0];}return ans;}
}

题解:先用HashMap将元素和出现频率存储起来,再用小根堆将出现频率按顺序保留,最后输出。

归纳:

将字符串转转换成整数:

int num = Integer.parseInt(i);

LinkedList

  • 获取链表最后一个元素
a.getLast();
  • 移除链表最后一个元素
a.moveLast();

Map遍历

Map.Entry<Integer, Integer> entry : map.entrySet()

优先级队列的比较器

new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1])

这里使用了 PriorityQueue 的构造函数,并传入了一个 Lambda 表达式 作为比较器(Comparator)。

比较器的作用是定义队列中元素的优先级规则。

Lambda 表达式 (pair1, pair2) -> pair1[1] - pair2[1]
pair1 和 pair2 是两个 int[] 类型的元素(即两个整数数组)。

pair1[1] 和 pair2[1] 分别表示这两个数组的第二个元素(索引为 1 的元素)。

pair1[1] - pair2[1] 是一个比较逻辑:

  • 如果 pair1[1] < pair2[1],结果为负数,表示 pair1 的优先级高于 pair2。

  • 如果 pair1[1] == pair2[1],结果为 0,表示两者优先级相同。

  • 如果 pair1[1] > pair2[1],结果为正数,表示 pair1 的优先级低于 pair2。


http://www.ppmy.cn/news/1572232.html

相关文章

缓存的介绍

相关面试题 &#xff1a; ● 为什么要用缓存&#xff1f; ● 本地缓存应该怎么做&#xff1f; ● 为什么要有分布式缓存?/为什么不直接用本地缓存? ● 为什么要用多级缓存&#xff1f; ● 多级缓存适合哪些业务场景&#xff1f; 缓存思想 空间换时间(索引&#xff0c;集群&a…

Jenkins+gitee 搭建自动化部署

Jenkinsgitee 搭建自动化部署 环境说明&#xff1a; 软件版本备注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好选稳定版本&#xff0c;不然安装插件有点麻烦 一、安装Jenkins程序 1、到官网下载相应的版本war或者直接使用yum安装 Jenkins官网下载 直接…

Docker 存储管理:卷、绑定挂载、临时存储

Docker 提供了多种存储方式&#xff0c;用于容器中的数据存储。根据不同的使用场景&#xff0c;Docker 提供了 卷&#xff08;Volumes&#xff09;、绑定挂载&#xff08;Bind Mounts&#xff09; 和 临时存储&#xff08;Tmpfs&#xff09; 等存储方式。每种存储方式有不同的特…

零基础开发自己的微信小程序(工具箱之父)(二)

完整界面如下&#xff0c;以上线微信小程序&#xff0c;大家可以前往微信小程序搜索工具箱之父即可体验 第三阶段&#xff0c;安装cursor 下载cursor 打开你创建的微信小程序界面 按ctrl加i调出框 它就会帮你打工了&#xff0c;然后有错误复制给它就行 我们可以选择我们的大模…

基于Docker-compose的禅道部署实践:自建MySQL与Redis集成及故障排查指南

基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与Redis集成及故障排查指南 禅道镜像版本&#xff1a;easysoft/zentao:21.4 Redis版本&#xff1a;redis:6.2.0 Mysql版本&#xff1a;mysql:8.0.35 文章目录 **基于Docker-compose的禅道部署实践&#xff1a;自建MySQL与…

github上创建person access token

在 GitHub 上创建 Personal Access Token&#xff08;PAT&#xff09; 时&#xff0c;权限设置非常重要。正确的权限设置可以确保 Token 能够访问所需的资源&#xff0c;同时避免授予过多权限带来的安全风险。以下是详细的权限设置说明&#xff1a; 1. 进入 Token 创建页面 登录…

Prolog语言的云计算

Prolog语言与云计算的结合 引言 随着信息技术的飞速发展&#xff0c;云计算作为一种新兴的计算模式&#xff0c;已经在各个领域得到了广泛应用。它通过网络将计算、存储和应用软件等资源集中管理&#xff0c;使得用户无需关注底层的基础设施就可以灵活地使用各种资源。与此同…

Springboot中添加原生websocket支持

1、添加配置 Configuration EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer {Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 注册WebSocket处理器&#xff0c;并允许所有来源的连接&#xff08;在生…