zoukankan      html  css  js  c++  java
  • <Stack> (高频)394 ( 高频)224

    394. Decode String

     四种情况: 

        1. 数字,把之前有的数字乘以10再加本数字

        2. ' [ ', 入口, 把之前的数字压入栈中并num归零。

        3. ' ] ' ,出口,归零。用dfs先讲栈中的最顶的string都取出,并按添加cnt次。

        4. 字母,压入栈中。 

    instanceof string : 判断是不是string类型。

    class Solution {
        public String decodeString(String s) {
            int num = 0;
            Stack<Object> stack = new Stack<>();
            
            for(char c : s.toCharArray()){
                //1.number
                if(Character.isDigit(c)){
                    num = num * 10 + c - '0';
                }else if(c == '['){//2. [
                    stack.push(Integer.valueOf(num));
                    num = 0;
                }else if(c == ']'){//3. ]
                        String newstr = dfs(stack);
                        Integer cnt = (Integer)stack.pop();
                        for(int i = 0; i < cnt; i++){
                            stack.push(newstr);
                        }
                }else{//letter
                    stack.push(String.valueOf(c));
                }
            }
            return dfs(stack);
        }
        
        private String dfs(Stack<Object> stack){
            Stack<String> tmp = new Stack<>();
            while(!stack.isEmpty() && stack.peek() instanceof String){
                tmp.push((String)stack.pop());
            }
            StringBuilder sb = new StringBuilder();
            while(!tmp.isEmpty()){
                sb.append(tmp.pop());
            }
            return sb.toString();
        }
    }

    224. Basic Calculator

    我们需要一个栈来辅助计算,用个变量sign来表示当前的符号,我们遍历给定的字符串s,如果遇到了数字,由于可能是个多位数,所以我们要用while循环把之后的数字都读进来,然后用sign*num来更新结果res;如果遇到了加号,则sign赋为1,如果遇到了符号,则赋为-1;如果遇到了左括号,则把当前结果res和符号sign压入栈,res重置为0,sign重置为1;如果遇到了右括号,结果res乘以栈顶的符号,栈顶元素出栈,结果res加上栈顶的数字,栈顶元素出栈。

    注意当最后一位不为0的时候,要计算出结果。

    class Solution {
        public int calculate(String s) {
            Stack<Integer> stack = new Stack<>();
            
            int i = 0;
            int num = 0;
            int sign = 1;
            int subsum = 0;
            while(i < s.length()){
                char c = s.charAt(i);
                if(Character.isDigit(c)){
                    num = num * 10 + (c - '0');
                }else if(c == '+'){
                    subsum += num * sign;
                    sign = 1;
                    num = 0;
                }else if(c == '-'){
                    subsum += num * sign;
                    sign = -1;
                    num = 0; 
                }else if(c == '('){
                    stack.push(subsum);
                    subsum = 0;
                    num = 0;
                    stack.push(sign);
                    sign = 1;
                }else if(c == ')'){
                    subsum += num * sign;
                    num = 0;
                    sign = 1;
                    subsum *= stack.pop();
                    subsum += stack.pop();
                }
                i++;
            }
            if(num != 0){
                subsum += num * sign;
            }
            return subsum;
        }
    }
  • 相关阅读:
    因数最多的数
    剪枝策略
    计蒜客 引爆炸弹(DFS、并查集)
    计蒜客 方程的解数(DFS)
    计蒜客 数独(DFS)
    计蒜客 王子救公主(DFS)
    kuangbin专题 专题九 连通图 POJ 3694 Network
    2019 ICPC Asia Nanjing Regional K. Triangle
    HDU 1875 畅通工程再续
    还是畅通工程 HDU
  • 原文地址:https://www.cnblogs.com/Afei-1123/p/12039976.html
Copyright © 2011-2022 走看看