栈和字符串,力扣.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;
    }
}
相关推荐
慕容青峰1 小时前
【蓝桥杯 2025 省 A 扫地机器人】题解
c++·算法·蓝桥杯·sublime text
_yingty_1 小时前
GO语言入门:常用数学函数2
java·学习·算法·golang
猎猎长风1 小时前
【数据结构和算法】3. 排序算法
数据结构·算法·排序算法
bookish_2010_prj1 小时前
链式栈和线性栈
数据结构·c++·算法
egoist20232 小时前
【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
数据结构·c++·算法·容器·哈希算法·散列表·c++11
Wang201220132 小时前
随机深林算法是分类还是回归?
算法·分类·回归
@蓝莓果粒茶2 小时前
LeetCode第158题_用Read4读取N个字符 II
前端·c++·python·算法·leetcode·职场和发展·c#
Heisenberg~2 小时前
C++回溯算法详解
开发语言·c++·算法
骑驴看星星a2 小时前
P10416 [蓝桥杯 2023 国 A] XYZ
算法·职场和发展·蓝桥杯
又过一个秋3 小时前
【sylar-webserver】重构日志系统
linux·c++·算法·重构