class039 嵌套类问题的递归解题套路【算法】

class039 嵌套类问题的递归解题套路

算法讲解039【必备】嵌套类问题的递归解题套路
在这里插入图片描述
在这里插入图片描述

Code1 772. 基本计算器 III

实现一个基本的计算器来计算简单的表达式字符串。

表达式字符串只包含非负整数,算符+、-、*、, ,左括号(和右括号)。整数除法需要向下截断

你可以假定给定的表达式总是有效的。所有的中间结果的范围均满足[-231,231-1]。
注意:你不能使用任何将字符串作为表达式求值的内置函数,比如eval( ) .

示例1:
输入:s = “1+1”
输出:2
示例2:
输入:s = “6-4/2”
输出:4
示例3:
输入:s =“2*(5+5*2)/3+(6/2+8)"
输出:21

提示:

  • 1 <= s <= 104
  • s 由整数、‘+’、‘-’、‘*’、’ / ‘、’(和’)′组成
  • s是一个有效的表达式

// 含有嵌套的表达式求值
// 测试链接 : https://leetcode.cn/problems/basic-calculator-iii/

思路:f(i)代表:i这段的计算结果
嵌套条件:有括号
退出条件:遇到右括号

package class039;import java.util.ArrayList;// 含有嵌套的表达式求值
// 测试链接 : https://leetcode.cn/problems/basic-calculator-iii/
public class Code01_BasicCalculatorIII {public static int calculate(String str) {where = 0;return f(str.toCharArray(), 0);}public static int where;// s[i....]开始计算,遇到字符串终止 或者 遇到)停止// 返回 : 自己负责的这一段,计算的结果// 返回之间,更新全局变量where,为了上游函数知道从哪继续!public static int f(char[] s, int i) {int cur = 0;ArrayList<Integer> numbers = new ArrayList<>();ArrayList<Character> ops = new ArrayList<>();while (i < s.length && s[i] != ')') {if (s[i] >= '0' && s[i] <= '9') {cur = cur * 10 + s[i++] - '0';} else if (s[i] != '(') {// 遇到了运算符 + - * /push(numbers, ops, cur, s[i++]);cur = 0;} else {// i (.....)// 遇到了左括号!cur = f(s, i + 1);i = where + 1;}}push(numbers, ops, cur, '+');where = i;return compute(numbers, ops);}public static void push(ArrayList<Integer> numbers, ArrayList<Character> ops, int cur, char op) {int n = numbers.size();if (n == 0 || ops.get(n - 1) == '+' || ops.get(n - 1) == '-') {numbers.add(cur);ops.add(op);} else {int topNumber = numbers.get(n - 1);char topOp = ops.get(n - 1);if (topOp == '*') {numbers.set(n - 1, topNumber * cur);} else {numbers.set(n - 1, topNumber / cur);}ops.set(n - 1, op);}}public static int compute(ArrayList<Integer> numbers, ArrayList<Character> ops) {int n = numbers.size();int ans = numbers.get(0);for (int i = 1; i < n; i++) {ans += ops.get(i - 1) == '+' ? numbers.get(i) : -numbers.get(i);}return ans;}}

code2 394. 字符串解码

// 含有嵌套的字符串解码
// 测试链接 : https://leetcode.cn/problems/decode-string/

嵌套条件:有数字
退出条件:遇到右括号

package class039;// 含有嵌套的字符串解码
// 测试链接 : https://leetcode.cn/problems/decode-string/
public class Code02_DecodeString {public static String decodeString(String str) {where = 0;return f(str.toCharArray(), 0);}public static int where;// s[i....]开始计算,遇到字符串终止 或者 遇到 ] 停止// 返回 : 自己负责的这一段字符串的结果// 返回之间,更新全局变量where,为了上游函数知道从哪继续!public static String f(char[] s, int i) {StringBuilder path = new StringBuilder();int cnt = 0;while (i < s.length && s[i] != ']') {if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) {path.append(s[i++]);} else if (s[i] >= '0' && s[i] <= '9') {cnt = cnt * 10 + s[i++] - '0';} else {// 遇到 [ // cnt = 7 * ? path.append(get(cnt, f(s, i + 1)));i = where + 1;cnt = 0;}}where = i;return path.toString();}public static String get(int cnt, String str) {StringBuilder builder = new StringBuilder();for (int i = 0; i < cnt; i++) {builder.append(str);}return builder.toString();}}

code3 726. 原子的数量

// 含有嵌套的分子式求原子数量
// 测试链接 : https://leetcode.cn/problems/number-of-atoms/

思路:遇到大写和(意味着要结算历史,历史数据包含name或map以及cnt

package class039;import java.util.TreeMap;// 含有嵌套的分子式求原子数量
// 测试链接 : https://leetcode.cn/problems/number-of-atoms/
public class Code03_NumberOfAtoms {public static String countOfAtoms(String str) {where = 0;TreeMap<String, Integer> map = f(str.toCharArray(), 0);StringBuilder ans = new StringBuilder();for (String key : map.keySet()) {ans.append(key);int cnt = map.get(key);if (cnt > 1) {ans.append(cnt);}}return ans.toString();}public static int where;// s[i....]开始计算,遇到字符串终止 或者 遇到 ) 停止// 返回 : 自己负责的这一段字符串的结果,有序表!// 返回之间,更新全局变量where,为了上游函数知道从哪继续!public static TreeMap<String, Integer> f(char[] s, int i) {// ans是总表TreeMap<String, Integer> ans = new TreeMap<>();// 之前收集到的名字,历史一部分StringBuilder name = new StringBuilder();// 之前收集到的有序表,历史一部分TreeMap<String, Integer> pre = null;// 历史翻几倍int cnt = 0;while (i < s.length && s[i] != ')') {if (s[i] >= 'A' && s[i] <= 'Z' || s[i] == '(') {fill(ans, name, pre, cnt);name.setLength(0);pre = null;cnt = 0;if (s[i] >= 'A' && s[i] <= 'Z') {name.append(s[i++]);} else {// 遇到 (pre = f(s, i + 1);i = where + 1;}} else if (s[i] >= 'a' && s[i] <= 'z') {name.append(s[i++]);} else {cnt = cnt * 10 + s[i++] - '0';}}fill(ans, name, pre, cnt);where = i;return ans;}public static void fill(TreeMap<String, Integer> ans, StringBuilder name, TreeMap<String, Integer> pre, int cnt) {if (name.length() > 0 || pre != null) {cnt = cnt == 0 ? 1 : cnt;if (name.length() > 0) {String key = name.toString();ans.put(key, ans.getOrDefault(key, 0) + cnt);} else {for (String key : pre.keySet()) {ans.put(key, ans.getOrDefault(key, 0) + pre.get(key) * cnt);}}}}}

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

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

相关文章

unity学习笔记

一、射线检测 如何让鼠标点击某个位置&#xff0c;游戏角色就能移动到该位置&#xff1f; 实现的原理分析&#xff1a;我们能看见游戏的东西就是摄像机拍摄到的东西&#xff0c;所以摄像机的镜平面就是当前能看到的了。 那接下来我们可以让摄像机发射一条射线&#xff0c;鼠标…

【网络编程】-- 01 概述、IP

网络编程 1 概述 1.1 计算机网络 (连接分散计算机设备以实现信息传递的系统) 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&…

06 硬件知识入门(MOSS管)

1 简介 MOS管和三极管的驱动方式完全不一样&#xff0c;以NPN型三极管为例&#xff0c;base极以小电流打开三极管&#xff0c;此时三极管的集电极被打开&#xff0c;发射极的高电压会导入&#xff0c;此时电流&#xff1a;Ic IbIe &#xff1b;电压&#xff1a;Ue>Uc>Ub…

JAVA IO:NIO

1.阻塞 IO 模型 ​ 最传统的一种 IO 模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线程交出 CPU。当…

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

java--枚举

1.枚举 枚举是一种特殊类 2.枚举类的格式 注意&#xff1a; ①枚举类中的第一行&#xff0c;只能写一些合法的标识符(名称)&#xff0c;多个名称用逗号隔开。 ②这些名称&#xff0c;本质是常量&#xff0c;每个常量都会记住枚举类的一个对象。 3.枚举类的特点 ①枚举类的…

ArcGIS提示当前许可不支持影像服务器

1、问题&#xff1a; 在用ArcGIS上处理影像栅格数据时&#xff08;比如栅格数据集裁剪、镶嵌数据集构建镶嵌线等&#xff09;经常会出现。 无法启动配置 RasterComander.ImageServer <详信息 在计算机XXXXX上创建服务器对象实例失败 当前许可不支持影像服务器。 ArcGIS提示当…

ChatGPT学习笔记

1 ChatGPT架构图 &#xff08;ChatGPT_Diagram.svg来自于【OpenA | Introducing ChatGPT】&#xff09; 2 模型训练 ChatGPT在训练时使用了PPO方法&#xff1b;

视界臻色彩 轻巧薄未来 《2023年中国OLED电视发展白皮书》发布

随着中国经济迈入新周期&#xff0c;彩电行业也进入存量竞争阶段。在此背景下&#xff0c;主流品牌围绕新产品、新技术、新应用等方面积极发力&#xff0c;特别是在高端彩电市场的争夺中&#xff0c;伴随着三星OLED的入局开始变得愈发激烈。我国“十三五”规划中明确指出&#…

算法通关村第三关—双指针思想及其应用(白银)

双指针思想及其应用 一、双指针思想 这里介绍一种简单但非常有效的方式一双指针。所谓的双指针其实就是两个变量&#xff0c;不一定真的是指针。双指针思想简单好用&#xff0c;在处理数组、字符串等场景下很常见。 看个例子&#xff0c;从下面序列中删除重复元素[1,2,2,2,3,…

如何使用phpStudy本地快速搭建网站并内网穿透远程访问

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

Spring 声明式事务

Spring 声明式事务 1.Spring 事务管理概述1.1 事务管理的重要性1.2 Spring事务管理的两种方式1.2.1 编程式事务管理1.2.2 声明式事务管理 1.3 为什么选择声明式事务管理 2. 声明式事务管理2.1 基本用法2.2 常用属性2.2.1 propagation&#xff08;传播行为&#xff09;2.2.2 iso…

(动手学习深度学习)第13章 实战kaggle竞赛:树叶分类

文章目录 实战kaggle比赛&#xff1a;树叶分类1. 导入相关库2. 查看数据格式3. 制作数据集4. 数据可视化5. 定义网络模型6. 定义超参数7. 训练模型8. 测试并提交文件 竞赛技术总结1. 技术分析2. 数据方面模型方面3. AutoGluon4. 总结 实战kaggle比赛&#xff1a;树叶分类 kagg…

MYSQL练题笔记-排序和分组-全7题已完成

排序和分组这部分共7道题&#xff0c;如下&#xff0c;只说一说3道&#xff0c;其他都写对了&#xff0c;也不难&#xff0c;只有最后一题难一点点&#xff0c;没想到那种解法&#xff0c;一看到主键和外键就想利用连接。 1.销售分析的题目和表相关内容如下 就是利用product_id…

西工大计算机学院计算机系统基础实验一(函数编写11~14)

稳住心态不要慌&#xff0c;如果考试周冲突的话&#xff0c;可以直接复制这篇博客和上一篇博客西工大计算机学院计算机系统基础实验一&#xff08;函数编写1~10&#xff09;-CSDN博客最后的代码&#xff0c;然后直接提交&#xff0c;等熬过考试周之后回过头再慢慢做也可以。 第…

pycharm使用Anaconda中的虚拟环境【我的入门困惑二】

Anaconda的作用 Anaconda的存在&#xff0c;使得一台电脑上可以存在多个不同版本的python和相应的包&#xff0c;这解决了多个项目运行时&#xff0c;所需要的python和包版本不同的问题。 本文内容 今天就来简单说说如何在pycharm使用Anaconda中的虚拟环境。 详细介绍 首先…

Reactor实战,创建一个简单的单线程Reactor(理解了就相当于理解了多线程的Reactor)

单线程Reactor package org.example.utils.echo.single;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.*; import java.util.Iterator; import java.util.Set;public class EchoServerReactor implements Runnable{Selector sele…

Presto:基于内存的OLAP查询引擎

PrestoSQL查询引擎 1、Presto概述1.1、Presto背景1.2、什么是Presto1.3、Presto的特性2、Presto架构2.1、Presto的两类服务器2.2、Presto基本概念2.3、Presto数据模型3、Presto查询过程3.1、Presto执行原理3.2、Presto与Hive3.3、Presto与Impala3.4、PrestoDB与PrestoSQL4、Pre…

云安全技术包括哪些?

云安全技术是随着云计算技术的发展而衍生出来的一种安全技术&#xff0c;它利用云计算的分布式处理和数据存储能力&#xff0c;实现对海量数据的快速处理和存储&#xff0c;同时采用机器学习和人工智能技术对数据进行分析和挖掘&#xff0c;以便更好地发现和防御安全威胁。云安…

视频后期特效处理软件 Motion 5 mac中文版

Motion mac是一款运动图形和视频合成软件&#xff0c;适用于Mac OS平台。 Motion mac软件特点 - 精美的效果&#xff1a;Motion提供了多种高质量的运动图形和视频效果&#xff0c;例如3D效果、烟雾效果、粒子效果等&#xff0c;方便用户制作出丰富多彩的视频和动画。 - 高效的工…