算法day24

第一题

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

   解法:利用数组来模拟一下栈

        

        对于上述字符串转换为字符数组,通过模拟栈的操作来解决这道题,当栈为空时下一位字符直接进行入栈操作,当当前数组中要入栈的字符和栈顶的字符相同时,进行出栈操作,同时字符数组进行向后移动一位的操作,一直这样进行,直到循环完整个字符串;

        总综上所述,代码如下: 解法:利用数组来模拟一下栈

class Solution {
    public String removeDuplicates(String s) {
        StringBuffer ret = new StringBuffer();
        char[] s1 = s.toCharArray();
        for(char ch : s1){
            if(ret.length() >0 && ch ==ret.charAt(ret.length() - 1)){
                //出栈
                ret.deleteCharAt(ret.length() - 1);
            }
            else{
                //进栈
                ret.append(ch);
            }
        }
        return ret.toString();
    }
}

第二题

        844. 比较含退格的字符串

 解法:利用数组来模拟一下栈

         对于上述字符串转换为字符数组,通过模拟栈的操作来解决这道题,当入栈的字符不是#时,直接进行入栈操作,当当前数组中要入栈的是#也栈顶的字符相同是,进行出栈操作,同时字符数组进行向后移动一位的操作,一直这样进行,直到循环完整个字符串;

        总综上所述,代码如下: 

class Solution {
    public boolean backspaceCompare(String s, String t) {
        return backret(s).equals(backret(t));
    }
    public String backret(String s1){
        StringBuffer ret = new StringBuffer();
        char[] s2 = s1.toCharArray();
        for(char ch: s2 ){
            if(ch != '#') ret.append(ch);
            else
                if(ret.length() > 0) {
                    ret.deleteCharAt(ret.length()-1);

                }
            
       }
       return ret.toString();
    }
}

第三题

227. 基本计算器 II

本题的类型:表达式求值;

方法:利用栈来模拟计算过程

步骤如下:

步骤一:将原始字符串转换为字符数组

        我们开始进行遍历数组,当遇到操作符时,要进行更新操作符变量op;

步骤二:

        遇到数字,首先使用tmp变量方便完整的记录数字;

步骤三:

        根据遇到的符号,处理不停的逻辑:

        如果遇到的是“+”符号,将tmp直接进行入栈操作;

         如果遇到的是“-”符号,将-tmp直接进行入栈操作;

        如果遇到的是“*”符号,将tmp直接乘到栈顶的元素上;

         如果遇到的是“/”符号,将tmp直接除到栈顶的元素上;

步骤四:

        将栈里面的所有数进行相加操作,得到结果并返回;

综上诉述,代码如下:

class Solution {
    public int calculate(String s) {
        Deque<Integer> st = new ArrayDeque<>();
        char op = '+';
        int i = 0,n = s.length();
        char[] s1 = s.toCharArray();

        while(i < n){
            if(s1[i] == ' ') i++;
            else if(s1[i] >='0' && s1[i] <= '9'){
                int tmp = 0;
                while(i < n && s1[i] >='0' && s1[i] <= '9'){
                    tmp = tmp * 10 + (s1[i] - '0');
                    i++;
                }
                if(op == '+') st.push(tmp);
                else if(op == '-') st.push(-tmp);
                else if(op == '*') st.push( st.pop() * tmp);
                else st.push(st.pop() / tmp);
            }
            else{
                op = s1[i];
                i++;
            }
        }
        int ret = 0;
        while(!st.isEmpty()){
            ret += st.pop();
        }
        return ret;
    }
}

ps:本次的内容就到这里了,如果对你有所帮助的话,就请一键三连哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值