面试经典150题0516

面试经典150题0516

Leetcode020 有效的括号

左括号直接添加到栈中,右括号要判断栈顶是否有匹配的左括号,有则继续,没有直接返回false

class Solution {
    public boolean isValid(String s) {
        Deque<Character> stack = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if(c == '(' || c == '{' || c == '['){
                stack.addLast(c);
            }
            else {
                if(stack.isEmpty()){
                    return false;
                }
                if(c == ')' && stack.peekLast() == '(' || c == '}' && stack.peekLast() == '{' || c == ']' && stack.peekLast() == '['){
                    stack.pollLast();
                    continue;
                }
                return false;
            }
        }
        return stack.isEmpty();
    }
}
Leetcode071 简化路径
import java.nio.file.Path;
public String simplifyPath(String path) {
    return Path.of(path).normalize().toString();
}

"/"作为分割,判断是否为正确的文件名。

  • tmp 为有效值 :存入栈中;
  • tmp.. :弹出栈顶元素(若存在);
  • tmp. :不作处理。
public static String simplifyPath(String path) {
    // 栈模拟
    Deque<String> stack = new ArrayDeque<>();
    int n = path.length();
    for (int i = 0; i < n; i++) {
        if(path.charAt(i) == '/'){
            continue;
        }
        // 找到下一个'\'前面的字串
        int j = i + 1;
        while (j < n && path.charAt(j) != '/'){
            j++;
        }
        String tmp = path.substring(i, j);
        if(tmp.equals("..")){
            if(!stack.isEmpty()){
                stack.pollLast();
            }
        }
        else if(!tmp.equals(".")){
            stack.addLast(tmp);
        }
        i = j;
    }
    StringBuilder stringBuilder = new StringBuilder();
    while (!stack.isEmpty()){
        stringBuilder.append("/").append(stack.pollFirst());
    }
    return stringBuilder.isEmpty() ? "/" : stringBuilder.toString();
}
Leetcode155 最小栈

借助一个辅助栈minStack存储stack中的最小值。

  • push():每当新值进来时,如果小于等于minStack栈顶的值,则同时push()到辅助栈minStack,即更新了栈顶的最小值。
  • pop():将栈中元素pop()时,比较是否和minStack的栈顶元素相同,相同则同时将minStack栈顶元素弹出。
  • getMin():返回minStack()栈顶元素即可。

minStack等价于遍历stack中所有元素,把升序的数字都删除,留下一个从栈底到栈顶降序的栈。相当于给stack中降序元素做了标记,每当pop()这些降序元素,minStack会将相应的栈顶元素pop()出去,保证栈顶元素始终为当前stack中的最小元素。

class MinStack {
    private Stack<Integer> stack;
    private Stack<Integer> minStack;
    public MinStack() {
        stack = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val) {
        if(minStack.isEmpty() || minStack.peek() >= val){
            minStack.push(val);
        }
        stack.push(val);
    }

    public void pop() {
        int tmp = stack.pop();
        if(!minStack.isEmpty() && tmp == minStack.peek()){
            minStack.pop();
        }
    }

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

    public int getMin() {
        return minStack.peek();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值