面试经典150题(47-49)

leetcode 150道题 计划花两个月时候刷完,今天(第二十天)完成了3道(47-49)150:

47.(71. 简化路径)题目描述:

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.''..')。
返回简化后得到的 规范路径 。
示例 1:
输入:path = "/home/"
输出:"/home"
示例 2:
输入:path = "/../"
输出:"/"

第一版(这个就是套用了栈。。因为 ”…“ 要删除上一个路径)

class Solution {
    public String simplifyPath(String path) {
        String[] paths=path.split("/");
        int len=paths.length;
        if(len<=1){
            return "/";
        }
        Stack<String> res=new Stack();
        for(String str:paths){
            if("".equals(str)||".".equals(str)){
                continue;
            }
            if("..".equals(str.trim())){
                if(!res.isEmpty()){
                   res.pop();
                }  
            }
            else{
                res.push(str);
            }
        }
        if(res.isEmpty()){
            return "/";
        }
        return "/"+String.join("/",res);
    }
}

48.(155. 最小栈)题目描述:

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

第一版(我一看到这题就想到之前遇到一个题,死活不会一看解析使用的优先队列,所以我就直接用优先队列去实现了)

class MinStack {
    Queue<Integer> priorityQueue;
    Stack<Integer> stack;
    public MinStack() {
        stack=new Stack<Integer>();
        priorityQueue=new PriorityQueue<Integer>();
    }
    
    public void push(int val) {
        stack.push(val);
        priorityQueue.offer(val);
    }
    
    public void pop() {
        Integer temp=stack.pop();
        priorityQueue.remove(temp);
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return priorityQueue.peek();
    }
}

第二版(一看解析,我只能说我是傻逼。。这个题遇到过好几次了。。但是还是没弄出来。。)

class MinStack {
    
    Stack<Integer> stack;
    Stack<Integer> minStack;
    public MinStack() {
        stack=new Stack<Integer>();
        minStack=new Stack<Integer>();
    }
    
    public void push(int val) {
        if(stack.isEmpty()||val<=minStack.peek()){
            minStack.push(val);
        }
        stack.push(val);
    }
    
    public void pop() {
        if(stack.peek().equals(minStack.peek())){
            minStack.pop();
        }
        stack.pop();
    }
    
    public int top() {
        return stack.peek();
    }
    
    public int getMin() {
        return minStack.peek();
    }
}

49.(150. 逆波兰表达式求值)题目描述:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+''-''*''/' 。
每个操作数(运算对象)都可以是一个整数或者另一个表达式。
两个整数之间的除法总是 向零截断 。
表达式中不含除零运算。
输入是一个根据逆波兰表示法表示的算术表达式。
答案及所有中间计算结果可以用 32 位 整数表示。

第一版(看到这题不知道你们会不会回忆起来当时刚学了C语言课设要让做一个带括号的计算器的痛苦。。真的是当时是很折磨,死活不会也看不懂,但是这个题是简单的)

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack=new Stack();
        for(String token:tokens){
            if("+".equals(token)){
                int num1=stack.pop();
                int num2=stack.pop();
                stack.push(num1+num2);
            }else if("-".equals(token)){
                int num1=stack.pop();
                int num2=stack.pop();
                stack.push(num2-num1);
            }else if("*".equals(token)){
                int num1=stack.pop();
                int num2=stack.pop();
                stack.push(num1*num2);
            }else if("/".equals(token)){
                int num1=stack.pop();
                int num2=stack.pop();
                stack.push(num2/num1);
            }else{
                stack.push(Integer.parseInt(token));
            }
        }
        return stack.peek();
    }
}

周末过得好快啊。。还没干啥感觉两天就没了。。

加油,好好 leetcode 希望面试时候能用到,早日跳槽!!!

你可能感兴趣的:(面试经典,150,题,算法,数据结构)