当前位置: 首页 > ai >正文

栈和字符串,力扣.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.xdnf.cn/news/774.html

相关文章:

  • 《马尼拉》桌游期望计算器
  • Ubuntu下展锐刷机工具spd_dump使用说明
  • Python3网络爬虫开发--爬虫基础
  • Java 设计模式心法之第4篇 - 单例 (Singleton) 的正确打开方式与避坑指南
  • 每天学一个 Linux 命令(30):cut
  • 【React】搜索时高亮被搜索选中的文案
  • 大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结
  • TensorFlow和PyTorch学习原理解析
  • 掌握常见 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理
  • FreeRTos学习记录--2.内存管理
  • 华为云获取IAM用户Token的方式及适用分析
  • 潞晨科技将暂停DeepSeek API服务,AI大模型技术红利普惠化与市场竞争白热化叠加,内卷恶果,开始显现!
  • 在线查看【免费】 dcm、drawio,dcm wps文件格式网站
  • Spring Boot集成Keycloak
  • 颠覆传统!毫秒级响应的跨平台文件同步革命,远程访问如本地操作般丝滑
  • 从“堆料竞赛”到“体验深耕”,X200 Ultra和X200s打响手机价值升维战
  • 【锂电池容量特征提取】NASA数据集锂电池容量特征提取(Matlab完整源码)
  • Java中 关于编译(Compilation)、类加载(Class Loading) 和 运行(Execution)的详细区别解析
  • Linux网络编程 多进程UDP聊天室:共享内存与多进程间通信实战解析
  • 四元数转旋转矩阵
  • 极狐GitLab CEO 柳钢受邀出席 2025 全球机器学习技术大会
  • Halcon应用:相机标定之应用
  • Shell脚本-变量的分类
  • 使用c++调用deepseek的api(附带源码)
  • 深度解析算法之位运算
  • 突破传统!SEARCH-R1如何让LLM与搜索引擎协同推理?
  • 使用SystemWeaver生成SOME/IP ETS ARXML的完整实战指南
  • FastGPT Docker Compose本地部署与硅基流动免费AI接口集成指南
  • Kubernetes相关的名词解释Metrics Server组件(7)
  • IPv4地址分类与常用网络地址详解