栈和字符串,力扣.43.字符串相乘力扣1047.删除字符串中的所有相邻重复项力扣.844比较含退格的字符串力扣227.基本计算器II

目录

力扣.43.字符串相乘

力扣1047.删除字符串中的所有相邻重复项

力扣.844比较含退格的字符串

力扣227.基本计算器II


力扣.43.字符串相乘

我们剩下的落两个数字即可。

class Solution {public static String multiply(String num1, String num2) {int m=num1.length();int n=num2.length();int[]a=new int[m+n-1];int p=1;int sum=m+n-1;
//处理特殊情况,假如出现前导0的情况,即123乘0,此时会出现0,0,0,0这种情况,多个0 是没用的,所以遇到0直接返回即可//   if(num1.equals("0")||num2.equals("0"))return "0";StringBuffer s=new StringBuffer();for(int j=n-1;j>=0;j--){int  k=sum-p;for(int i=m-1;i>=0;i--){a[k--]+=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');}p++;}for(int i=sum-1;i>0;i--){a[i-1]+=a[i]/10;a[i]=a[i]%10;}for(int i=0;i<a.length;i++){s.append(a[i]);}//我们可以想一下什么情况会有前导0,只有当x*0时候会出现前导0,因此我们可以上面那种处理方式
//也可以用下面这种方式,我必须要保持前导0,最多存在一个就是0,其余的假如第一个是0,我们就把它删除while(s.length()>1&&s.charAt(0)=='0'){s.deleteCharAt(0);}return s.toString();}}

while(s.length()>1&&s.charAt(0)=='0'){

s.deleteCharAt(0);

}

力扣1047.删除字符串中的所有相邻重复项

class Solution {public  static String removeDuplicates(String s) {Stack<Character>a=new Stack<>();for(int i=0;i<s.length();i++){if(!a.isEmpty()&&a.peek()==s.charAt(i)){a.pop();}else{a.add(s.charAt(i));}}StringBuffer ret=new StringBuffer();while (!a.isEmpty()){ret.append(a.pop());}return ret.reverse().toString();}
}

力扣.844比较含退格的字符串

用栈进行基本的模拟,然后假如出现#就删除

class Solution {public boolean backspaceCompare(String s, String t) {Stack<Character>a=new Stack<>();Stack<Character>b=new Stack<>();for(int i=0;i<s.length();i++){if(!a.isEmpty()&&s.charAt(i)=='#'){a.pop();}else if(a.isEmpty()&&s.charAt(i)=='#'){continue;}else{a.add(s.charAt(i));}}for(int i=0;i<t.length();i++){if(!b.isEmpty()&&t.charAt(i)=='#'){b.pop();}else if(b.isEmpty()&&t.charAt(i)=='#'){continue;}else{b.add(t.charAt(i));}}if(a.size()!=b.size())    return false;while(!a.isEmpty()){if(a.pop()!=b.pop()){return false;}}return true;}
}

力扣227.基本计算器II

考验代码能力细节很多,使用两个栈,当然这么写也是因为我菜,题解肯定比我好很多,我一会抄一手,学习一下,

public static int calculate(String s) {char[]ss=s.toCharArray();//这个来存储符号Stack<Character>a=new Stack<>();//这个存储数字,为什么要双栈,因为假如超过100000,字符无法存储这么大的整数Stack<Integer>b=new Stack<>();int tmp=0;int k=0;for(int i=0;i<ss.length;i++){if(ss[i]==' ') continue;//思考一下,假如342怎么办,往前面找是否是一个好的想法 假如一个情况3*42/66换句话说,我们应该计算第一个循环就把这种统计出来//而他更需要进行一个所谓的优先处理,只要他不是符号,我们都检查一下(这个应该是优于乘除法的)if(ss[i]-'0'>=0) {StringBuffer p = new StringBuffer();//假如前一个是4,来一个循环遍历一手while (i < ss.length && ss[i] - '0' >= 0) {p.append((ss[i]-'0'));if(i+1<ss.length&&ss[i+1]-'0'>=0) {//只有当下一个不是符号的时候,才可以加加i++;}else{break;}}k = Integer.valueOf(p.toString());b.add( k);} else if(ss[i]-'0'<0){a.add(ss[i]);}//假如是乘法或者是除法我们进行优先处理,因为没有括号,并且当前值不可以是符号就进行计算,进行计算的时候,一定保证是数字if(!a.isEmpty()&&ss[i]-'0'>=0&&(a.peek()=='*'||a.peek()=='/')){if(a.peek()=='*'){a.pop();tmp=b.pop()*b.pop();b.add(tmp);}else if(a.peek()=='/'){a.pop();int t=b.pop();tmp=b.pop()/t;b.add(tmp);}}//当他是符号时候,先去添加符号}
//上面我们相当于把乘法和除法处理完成,最后应该只剩下加法了//3+2+3+4
//        tmp=0; //暂时保存值
//int sum=0;while (!a.isEmpty()&&!b.isEmpty()) {//处理加法的情况while (!a.isEmpty()&&!b.isEmpty()&&a.peek() == '+') {a.pop();sum+= b.pop();}while(!a.isEmpty()&&!b.isEmpty()&&a.peek() == '-') {a.pop();int t = b.pop();sum-=t;}}if(!b.isEmpty()) sum+=b.pop();return sum;}

较为优秀的写法,使用了一个栈,并且把上面我的逻辑相当于更加一步的理清,并且删除了一些不必要的冗余代码

class Solution {public static int calculate(String s) {char[]ss=s.toCharArray();//这个来存储符号Stack<Integer>b=new Stack<>();char op='a';int k=0;for(int i=0;i<ss.length;i++){if(ss[i]==' ') continue;if(ss[i]-'0'>=0){StringBuffer p = new StringBuffer();//这里的想法是,我们不去处理什么倍数乘10,乘100,太过麻烦,不如就使用字符串的拼接,直接拼到一起,这样会更省心,但是带来的就是时间while (i < ss.length && ss[i] - '0' >= 0) {p.append((ss[i]-'0'));if(i+1<ss.length&&ss[i+1]-'0'>=0) {i++;} //只有当下一个不是符号的时候,才可以加加else{break;}}k = Integer.valueOf(p.toString());//假如是乘法或者是除法我们进行优先处理,因为没有括号,并且当前值不可以是符号就进行计算,进行计算的时候,一定保证是数字if(op=='*'){ b.add(b.pop()*k);}else if(op=='/'){b.add(b.pop()/k);}else if(op=='-'){b.add(-k); }else{b.add(k); } op='+';continue;}//当他是符号时候,先去添加符号else {op=ss[i]; continue;}}
//上面我们相当于把乘法和除法,减法处理完成,最后应该只剩下加法了int sum=0;while(!b.isEmpty()){sum+=b.pop();}return sum;}
}

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

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

相关文章

Spring Boot单元测试实战指南:从零到高效测试

在Spring Boot开发中&#xff0c;单元测试是保障代码质量的核心环节。本文将基于实际开发场景&#xff0c;手把手教你如何快速实现分层测试、模拟依赖、编写高效断言&#xff0c;并分享最佳实践&#xff01; 一、5分钟环境搭建 添加依赖 在pom.xml中引入spring-boot-starter-te…

React状态提升深度解析:原理、实战与最佳实践

一、状态提升的本质认知 React状态提升&#xff08;State Lifting&#xff09;是组件间通信的核心模式&#xff0c;其本质是通过组件树层级关系重构实现状态共享。与传统父子传参不同&#xff0c;它通过将状态提升到最近的共同祖先组件&#xff0c;建立单向数据流高速公路。 …

https nginx 负载均衡配置

我的系统是OpenEuler。 安装nginx yum install -y nginx 启动&开机启动 systemctl start nginx systemctl enable nginx 自定义conf配置文件 cat <<EOF >> /etc/nginx/conf.d/load_balancer.conf upstream backend {ip_hash; # 防止验证码验证失败server…

各种插值方法的Python实现

插值方法的Python实现 1. 线性插值&#xff08;Linear Interpolation&#xff09; 原理&#xff1a;用直线连接相邻数据点&#xff0c;计算中间点的值。 实现&#xff1a; import numpy as np from scipy.interpolate import interp1dx np.array([0, 1, 2, 3, 4]) y np.arr…

重新定义户外防护!基于DeepSeek的智能展开伞棚系统技术深度解析

从“手动操作”到“感知决策”&#xff0c;AI重构城市空间弹性 全球极端天气事件频发&#xff0c;传统伞棚依赖人工展开/收纳&#xff0c;存在响应滞后&#xff08;暴雨突袭时展开需3-5分钟&#xff09;、抗风能力弱&#xff08;8级风损毁率超60%&#xff09;、空间利用率低等痛…

Redis 基础和高级用法入门

redis 是什么&#xff1f; Redis是一个远程内存数据库&#xff0c;它不仅性能强劲&#xff0c;而且还具有复制特性以及为解决问题而生的独一无二的数据模型。Redis提供了5种不同类型的数据结构&#xff0c;各式各样的问题都可以很自然地映射到这些数据结构上&#xff1a…

常见数据库关键字示例 SQL 及执行顺序分析(带详细注释)

示例 SQL 及执行顺序分析&#xff08;带详细注释&#xff09; 示例 1&#xff1a;基础查询&#xff08;含多表关联、过滤、分组、排序&#xff09; SELECT -- 1. 选择字段&#xff08;包含聚合函数和别名&#xff09;e.department, COUNT(e.employee_id) AS total_employees, …

设计模式--建造者模式详解

建造者模式 建造者模式也属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式 定义&#xff1a;将一个复杂对象的构建和它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示&#xff08;假设有不同的建造者实现类&#xff0c;可以产生不同的产品&#xff09…

PCB 过孔铜厚的深入指南

***前言&#xff1a;在上一期的文章中介绍了PCB制造的工艺流程&#xff0c;但仍然想在过孔的铜厚和PCB的过孔厚径比两个方面再深入介绍。 PCB铜厚的定义 电路中铜的厚度以盎司(oz)**表示。那么&#xff0c;为什么用重量单位来表示厚度呢? 盎司(oz)的定义 将1盎司(28.35 克)的铜…

如何配置 Conda 使用镜像源加速

如何配置 Conda 使用镜像源加速 为了提高使用 Anaconda 或 Miniconda 时包管理的速度&#xff0c;特别是在国内网络环境下&#xff0c;可以通过配置镜像源来实现更快的下载。以下是详细的步骤说明&#xff1a; 1. 安装 Conda&#xff08;如果尚未安装&#xff09; 如果你还没…

【k8s】k8s是怎么实现自动扩缩的

Kubernetes 提供了多种自动扩缩容机制&#xff0c;主要包括 Pod 水平自动扩缩&#xff08;HPA&#xff09;、垂直 Pod 自动扩缩&#xff08;VPA&#xff09; 和 集群自动扩缩&#xff08;Cluster Autoscaler&#xff09;。以下是它们的实现原理和配置方法&#xff1a; 1. Pod …

Reflex 完全指南:用 Python 构建现代 Web 应用的终极体验

“写 Python&#xff0c;就能构建 Web 前端。”——这不再是梦想&#xff0c;而是由 Reflex 带来的现实。 过去&#xff0c;构建一个现代 Web 应用意味着你要学会前端&#xff08;React/JS/HTML/CSS&#xff09; 后端&#xff08;Flask/Django&#xff09; API 交互&#xff08…

Vue实战(08)解决 Vue 项目中路径别名 `@` 在 IDE 中报错无法识别的问题

一、引言 ​ 在 Vue 项目开发过程中&#xff0c;路径别名是一个非常实用的特性&#xff0c;它能够帮助开发者简化文件引用路径&#xff0c;提高代码的可读性和可维护性。其中&#xff0c; 作为一个常见的路径别名&#xff0c;通常被用来指向项目的 src 目录。然而&#xff0c;…

5.学习笔记-SpringMVC(P61-P70)

SpringMVC-SSM整合-接口测试 (1)业务层接口使用junit接口做测试 (2)表现层用postman做接口测试 (3)事务处理— 1&#xff09;在SpringConfig.java&#xff0c;开启注解&#xff0c;是事务驱动 2&#xff09;配置事务管理器&#xff08;因为事务管理器是要配置数据源对象&…

[论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models

REPLUG: Retrieval-Augmented Black-Box Language Models REPLUG: Retrieval-Augmented Black-Box Language Models - ACL Anthology NAACL-HLT 2024 在这项工作中&#xff0c;我们介绍了RePlug&#xff08;Retrieve and Plug&#xff09;&#xff0c;这是一个新的检索增强型…

Mysql的深度分页查询优化

一、深度分页为什么慢&#xff1f; 当执行 SELECT * FROM orders ORDER BY id LIMIT 1000000, 10 时&#xff1a; MySQL 会扫描前 1,000,010 行&#xff0c;丢弃前 100 万行&#xff0c;仅返回 10 行。偏移量&#xff08;offset&#xff09;越大&#xff0c;扫描行数越多&…

最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程

大家好&#xff0c;我是斜杠君。 知识星球群有同学和我说每天的工作涉及很多数据表的重复操作&#xff0c;想学习Excel数据表通过大模型自动转数据图片的功能。 今天斜杠君就带大家一起搭建一个智能体&#xff0c;以一个销售行业数据为例&#xff0c;可以快速实现自动清洗Exc…

Uniapp 中缓存操作指南

在 Uniapp 中,你可以使用三种方式操作缓存:同步方法、异步方法和 Vuex 持久化存储。以下是详细的设置、获取和清除缓存的方法: 1. 同步方法 设置缓存 uni.setStorageSync(key, value); // 示例 uni.setStorageSync(token, abc123); 获取缓存 const value = uni.getStor…

k8s的yaml文件里的volume跟volumeMount的区别

volume 是 Pod 级别的资源&#xff0c;用于定义存储卷。它是一个独立于容器的存储资源&#xff0c;可以被一个或多个容器共享使用。volume 的定义位于 Pod 的 spec.volumes 部分。 特点 独立性&#xff1a;volume 是 Pod 的一部分&#xff0c;而不是容器的一部分。它独立于容…

梅毒单阳能否通过国企体检?

国企体检通常会参照公务员体检标准进行&#xff0c;梅毒检测是其中的常规项目。 一、明确“梅毒单阳”的定义 检测指标解析 TPPA阳性RPR阴性&#xff1a;可能为既往感染已治愈&#xff0c;或极早期/晚期梅毒&#xff1b; RPR阳性TPPA阴性&#xff1a;需警惕假阳性&#xff08…