力扣爆刷第167天之TOP200五连刷101-105(二叉树序列化、验证IP、LFU)

力扣爆刷第167天之TOP200五连刷101-105(二叉树序列化、验证IP、LFU)

文章目录

      • 力扣爆刷第167天之TOP200五连刷101-105(二叉树序列化、验证IP、LFU)
      • 一、224. 基本计算器
      • 二、297. 二叉树的序列化与反序列化
      • 三、283. 移动零
      • 四、468. 验证IP地址
      • 五、460. LFU 缓存

一、224. 基本计算器

题目链接:https://leetcode.cn/problems/basic-calculator/description/
思路:实现计算器,这也是一个经典题目了,是逐步进阶的,比如只有加减法,有加减乘除,有括号,这是一步一步升级来的,对于只有加减乘除的题来说,使用一个栈来分情况吧数值压入栈中进行处理,需要提前维护一个符号位,是当前数值的前一个符号位,当再次遇到符号时,就是把前一个数压栈的时机,加减就压正负数,乘除需要出栈然后与当前数进行运算再压栈。对于有括号类型的题目,只需要遇到左括号直接递归,遇到右括号退出递归。此外要注意边界条件,如压栈的时机,排除空格以后,只要不是数值就得压栈,如果元素空了抵达字符串尾部了也需要压栈处理了,因为等不到下一个非数值符号了。
具体的可以参考拉不拉东:https://labuladong.online/algo/data-structure/implement-calculator/

class Solution {public int calculate(String s) {Deque<Character> queue = new LinkedList<>();for(int i = 0; i < s.length(); i++) {if(s.charAt(i) == ' ') continue;queue.add(s.charAt(i));}return helper(queue);}int helper(Deque<Character> queue) {int num = 0;char sign = '+';Deque<Integer> stack = new LinkedList<>();while(!queue.isEmpty()) {char c = queue.poll();if(c >= '0' && c <= '9') num = num * 10 + (c - '0');if(c == '(') num = helper(queue);if(c < '0' || c > '9' || queue.isEmpty()){if(sign == '+') stack.push(num);else if(sign == '-') stack.push(-num);else if(sign == '*') stack.push(stack.pop() * num);else if(sign == '/') stack.push(stack.pop() / num);num = 0;sign = c;}if(c == ')') break;}int res = 0;while(!stack.isEmpty()) {res += stack.pop();}return res;}
}

二、297. 二叉树的序列化与反序列化

题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/description/
思路:要求对二叉树进行序列化和反序列化,其实我们只需要按照任意一种遍历顺序,遍历一遍记录下来,当然要记录下来节点和null节点,转成字符串这就是序列化,然后再按照遍历的顺序再遍历一遍,在遍历的过程中构建树即可,就完成了反序列化。关键点是对于null节点的记录。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {StringBuilder builder = new StringBuilder();String[] list;int i = 0;public String serialize(TreeNode root) {traverse(root);return builder.toString();}public TreeNode deserialize(String data) {list = data.split(",");return create(list);}void traverse(TreeNode root) {if(root == null) {builder.append("#,");return;}builder.append(root.val + ",");traverse(root.left);traverse(root.right);}TreeNode create(String[] list) {if(i == list.length || list[i].equals("#")) {i++;return null;}TreeNode node = new TreeNode(Integer.parseInt(list[i++]));node.left = create(list);node.right = create(list);return node;}
}// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

三、283. 移动零

题目链接:https://leetcode.cn/problems/move-zeroes/description/
思路:移动零也是很经典的题,可以通过双指针来做,但凡右指针遇到非零数就与左指针交换,然后左指针向右移动一下即可。

class Solution {public void moveZeroes(int[] nums) {int k = 0;for(int i = 0; i < nums.length; i++) {if(nums[i] == 0) k++;else {int t = nums[i-k];nums[i-k] = nums[i];nums[i] = t;}}}
}

四、468. 验证IP地址

题目链接:https://leetcode.cn/problems/validate-ip-address/description/
思路:验证是IPv4还是IPv6本身没有什么就要考虑的边界条件太多了,思路很简单。
1、首先通过".“和”:“的数量来判断是进行IPv4的判断还是进行IPv6的判断。
2、对于IPv4来说要从多个角度进行判断,包括用”.“分割后的字符串数量,单个字符串的长度,是否有前导零,是否数值超出255.
3、对于IPv6来说也是从多个角度判断,包括用”:"分割后的字符串的数量,单个字符串的长度,是否超出ffff或者FFFF。

class Solution {public String validIPAddress(String queryIP) {int a = 0, b = 0;for(int i = 0; i < queryIP.length(); i++) {if(queryIP.charAt(i) == '.') a++;if(queryIP.charAt(i) == ':') b++;if(a != 0 && b != 0) return "Neither";}if(a == 3) return isIPv4(queryIP);else if(b == 7) return isIPv6(queryIP);else return "Neither";}String isIPv4(String queryIP) {String[] list = queryIP.split("\\.");if(list.length < 4) return "Neither";for(String s : list) {if(s.length() > 1 && s.charAt(0) == '0' || s.length() == 0 || s.length() > 3) return "Neither";int num = 0;for(int i = 0; i < s.length(); i++) {char c = s.charAt(i);if(c < '0' || c > '9') return "Neither";num = num * 10 + (c - '0');}if(num > 255) return "Neither";}return "IPv4";}String isIPv6(String queryIP) {String[] list = queryIP.split(":");if(list.length < 8) return "Neither";for(String s : list) {if(s.length() > 4 || s.length() == 0) return "Neither";for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if((c > 'f' && c <= 'z') || c > 'F' && c <= 'Z') return "Neither";}}return "IPv6";}
}

五、460. LFU 缓存

题目链接:https://leetcode.cn/problems/lfu-cache/description/
思路:对于LFU和LRU。
LRU是最近最少使用,容量满了会丢弃最早访问的元素,所以需要维护一个访问的顺序,这个模拟LinkedHashMap就可以实现。
LFU是最不经常使用,容量满了会丢弃使用频率最低的元素,如果有多个使用频率相同的元素,要丢弃最早添加的元素。所以LFU相对来说麻烦一些。
要使用LFU,需要几个条件:
1、记录key和value,使用hashmap:ktv;
2、记录key对应的频率,使用hashmap:ktf;
3、记录频率对应的有序元素集合,使用hashmap<Integer, LinkedHashSet> : ftk。
维护好这三个集合即可。

class LFUCache {HashMap<Integer, Integer> ktv = new HashMap<>();HashMap<Integer, Integer> ktf = new HashMap<>();HashMap<Integer, LinkedHashSet<Integer>> ftk = new HashMap<>();int cap = 0;int midFre = 0;public LFUCache(int capacity) {cap = capacity;}public int get(int key) {if (!ktv.containsKey(key)) {return -1;}int v = ktv.get(key);up(key);return v;}void up(int key) {int f = ktf.get(key);ktf.put(key, f+1);ftk.get(f).remove(key);ftk.putIfAbsent(f+1, new LinkedHashSet());ftk.get(f+1).add(key);if(ftk.get(f).isEmpty()) {ftk.remove(f);if(midFre == f) midFre++;}}public void put(int key, int value) {if(ktv.containsKey(key)) {ktv.put(key, value);up(key);return;}if(ktv.size() == cap) {int k = ftk.get(midFre).iterator().next();ftk.get(midFre).remove(k);if(ftk.get(midFre).isEmpty()) ftk.remove(midFre);ktv.remove(k);ktf.remove(k);}ktv.put(key, value);midFre = 1;ktf.put(key, 1);ftk.putIfAbsent(1, new LinkedHashSet());ftk.get(1).add(key);}
}/*** Your LFUCache object will be instantiated and called as such:* LFUCache obj = new LFUCache(capacity);* int param_1 = obj.get(key);* obj.put(key,value);*/

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

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

相关文章

【每日一练】python的类型注解和Union类型使用方法

""" 本节课程内容 函数&#xff08;方法&#xff09;的类型注解 Union类型 1.为函数&#xff08;方法&#xff09;的形参进行类型的注解 2.为函数&#xff08;方法&#xff09;的返回值进行类型的注解 注意&#xff1a;类型注解并非强制性&#xff0c;是提示…

React 学习——行内样式、外部样式、动态样式

三种样式的写法 import "./index.css"; //同级目录下的样式文件 function App() {const styleCol {color: green,fontSize: 40px}// 动态样式const isBlock false;return (<div className"App">{/* 行内样式 */}<span style{{color:red,fontSiz…

Vue修饰符的使用

在 Vue.js 中&#xff0c;修饰符&#xff08;modifiers&#xff09;是一种特殊的后缀&#xff0c;用于指令以特殊方式修改指令的行为。修饰符通过在指令名称后面添加点&#xff08;.&#xff09;及修饰符名称来表示。Vue 提供了一些常用的修饰符&#xff0c;帮助开发者处理事件…

工程视角:数据结构驱动的应用开发--字典(dictionary),列表(list)与实体

这里写目录标题 业务业务场景流程分析 实现数据访问层&#xff08;DAL&#xff09;业务逻辑层&#xff08;BLL&#xff09;用户界面层&#xff08;UI&#xff09;工具类 设计思路为什么抽出工具类关于U层使用字典的好处工程视角 业务 业务场景 在一个金融应用系统中&#xff0c…

iptables 限制端口仅特定IP访问。

注意&#xff1a; 需要用源地址(-s)&#xff0c;而不是目的地址(-d) 单个IP&#xff1a; iptables -A INPUT -p tcp -m tcp --dport 3306 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP 多个IP&#xff1a; iptables -A INPUT -p tcp -m t…

LLaVA论文阅读+Colab部署

LLaVA &#xff1a;Visual Instruction Tuning 1. Colab上部署LLaVA2. 论文摘要3. 多模态指令跟随数据4. 模型架构5. 模型训练6. 消融实验7. CC3M数据过滤8. 总结 1. Colab上部署LLaVA 代码&#xff1a; https://github.com/Czi24/Awesome-MLLM-LLM-Colab/tree/master/MLLM/LL…

CUDA编程02 - 数据并行介绍

一:概述 数据并行是指在数据集的不同部分上执行计算工作,这些计算工作彼此相互独立且可以并行执行。许多应用程序都具有丰富的数据并行性,使其能够改造成可并行执行的程序。因此,对于程序员来说,熟悉数据并行的概念以及使用并行编程语言来编写数据并行的代码是非常重要的。…

2024.7.23总结(东莞入职培训day2)

今天写总结也很晚了&#xff0c;但是今天收获特别丰满&#xff0c;必须回顾一下&#xff0c;这些都是宝贵的财富。 1.讲课老师很特别棒 今天的讲课老师特别棒&#xff0c;很是优秀&#xff0c;她讲的课程质量还是非常高的&#xff0c;能够带动学生去深度思考&#xff0c;小伙…

超大数字四舍五入保留N位小数【没bug】

大部分npm常用的插件四舍五入都是用数值直接去计算四舍五入的存在精度问题&#xff0c;本方法是用用字符串拆分比较整数大小&#xff0c;这样就避开了精度的问题&#xff1b; 该方法可以传入&#xff1a;1.134、99.99、9999999999999999999.99999、.001、12.、0.、00.、类似的…

.netcore TSC打印机打印

此文章给出两种打印案例&#xff0c; 第一种是单列打印&#xff0c;第二种是双列打印 需要注意打印机名称的设置&#xff0c;程序中使用的打印机名称为999&#xff0c;电脑中安装打印机时名称也要为999。 以下是我在使用过程中总结的一些问题&#xff1a; 一 TSC打印机使用使…

【Node.js基础02】fs、path模块

目录 一&#xff1a;fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二&#xff1a;path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一&#xff1a;fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…

弹性布局 flex layout HTML CSS

文章目录 效果图参考文档代码 效果图 其实弹性布局的好处是&#xff1a;当网页大小变化&#xff08;如窗口resize&#xff09;时&#xff0c;处于弹性容器(flex container)中的弹性元素(flex item) 之间的距离也会变化。 需要特别注意的是&#xff1a; 弹性布局的主要CSS如下。…

生成式AI未来趋势预测

随着生成式AI技术的不断进步&#xff0c;关于其未来发展方向的讨论也愈发激烈。生成式AI的未来可能会在对话系统&#xff08;Chat&#xff09;中展现智慧&#xff0c;也可能在自主代理&#xff08;Agent&#xff09;中体现能力。以下是具体分析&#xff1a; 1. **技术成熟度**&…

开源邮箱套件介绍系列2:Roundcube webmail

1. 项目介绍 项目网站&#xff1a;Roundcube – Free and Open Source Webmail Software Roundcube 项目是一个免费的开源网络邮件解决方案&#xff0c;具有类似桌面的用户界面&#xff08;Webmail&#xff09;&#xff0c;易于安装/配置&#xff0c;并且可以在标准的LAMPP服…

网络安全新视角:2024年威胁 landscape与防护策略

网络安全新视角&#xff1a;2024年威胁 landscape与防护策略 2024年网络安全威胁趋势分析 云集中风险 随着云计算的普及&#xff0c;云服务商集中化趋势明显&#xff0c;企业越来越依赖于少数几家云服务商&#xff0c;导致云集中风险逐渐显现。例如&#xff0c;阿里云在2023…

PostgreSQL 中如何处理数据的唯一性约束?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何处理数据的唯一性约束&#xff1f;一、什么是唯一性约束二、为什么要设置唯一性约束…

SAP第二季度财报和进一步裁员计划

7月22日公布了截至 2024 年 6 月 30 日的第二季度财务报告。以下位总体指标 当前云计算在手订单达 148 亿欧元&#xff0c;按名义货币和固定汇率计算均增长 28%云收入增长 25%&#xff0c;其中云 ERP 套件收入增长 33%&#xff0c;均按名义货币和固定汇率计算总收入增长 10%&a…

mysql 先子查询过滤再联合 和 先联合再过滤 执行效率问题

执行顺序 先子查询过滤再联合 SELECT XXX FROM(select * from edw_data_dyd.overrun_offsite_info WHERELENGTH( VEHICLE_ID ) > 12 AND CREATED_TIME > DATE_ADD(NOW(),INTERVAL -1 HOUR)AND CREATED_TIME < NOW()AND VEHICLE_ID not like %无车牌%AND VEHICLE_I…

Mac中maven配置安装路径

Mac中maven配置安装路径 没有下载maven的可以先下载&#xff1a;&#xff08;这里建议maven版本不要下高了&#xff09; 如果你的bash_profile中没有配置JAVA_HOME路径&#xff0c;可以按照下面的命令配置一下 获取JAVA的安装路径&#xff1a; /usr/libexec/java_home -V …

Pycharm2024最新版community社区版下载安装配置,快速上手

第一步&#xff1a;下载 方法1&#xff1a;官网链接 https://www.jetbrains.com/pycharm/download/?sectionwindows .方法2&#xff1a;百度网盘 链接&#xff1a;https://pan.baidu.com/s/1ic2N5hUQ2m1Kmyr5nK9Jxw?pwd76dt 提取码&#xff1a;76dt --来自百度网盘超级…