LeetCode Hot100 (Java实现) ---Day3

最小栈

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
1.MinStack() 初始化堆栈对象。
2.void push(int val) 将元素val推入堆栈。
3.void pop() 删除堆栈顶部的元素。
4.int top() 获取堆栈顶部的元素。
5.int getMin() 获取堆栈中的最小元素。

class MinStack {
//辅助栈思想,专门用一个栈来getMin()
    private Stack<Integer> stack;
    private Stack<Integer> minStack;  //辅助
    //初始化,直接调JAVA的Stack
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    } 
    //stack直接入栈
    //辅助栈因为必须要保证栈顶元素最小,所以入栈时要进行判断
    //当新入栈值小于辅助栈的栈顶元素时,才进行入栈
    public void push(int val) {
        stack.push(val);
        if(!minStack.isEmpty()){
            if(val<=minStack.peek()){
                minStack.push(val);
            }
        }else{
            minStack.push(val);
        }
    }
    //出栈同样要做到两个栈的情况判断
    //因为辅助栈不是所有元素都添加,所以只有当stack出栈元素在辅助栈中,辅助栈才需要出栈
    public void pop() {
        int top = stack.pop();
        if(top==minStack.peek()){
        minStack.pop();}

    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = “3[a]2[bc]”
输出:“aaabcbc”

class Solution {
    public String decodeString(String s) {
    //双栈思想,分别为数字和字符建栈
    //为啥考虑用栈?
        Stack<Integer> numStack = new Stack();
        Stack<String> strStack = new Stack();
        //数字即倍数关系,先置0
        int num = 0;
        //为了字符操作方便。new了个StringBuilder存放字符
        StringBuilder sb = new StringBuilder();
        //遍历字符串
        //1.先判断字符是否为数字,若为数字字符则将字符转化为实际的倍数,其中考试多位数情况
        //2.判断字符是否为字,若是,更新Builder内容
        //3.遇到'[',把num和sb都入栈
        //4.遇到']',出栈,字符保存到临时串中,因为原sb可能存在没入栈的字符,设置遍历倍数times来保证倍数得到实现
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(c>='0'&&c<='9'){
                num = num*10 + (c-'0');
            }else if(c>='a'&&c<='z'){
                sb.append(c);
            }else if(c=='['){
                numStack.push(num);
                strStack.push(sb.toString());
                sb=new StringBuilder();
                num = 0;
            }else{
                StringBuilder tmp = new StringBuilder(strStack.pop());
                int times = numStack.pop();
                for(int j=0;j<times;j++){
                    tmp.append(sb);
                }sb=tmp;
            }
        }return sb.toString();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值