【LeetCode-经典面试150题-day12】

这篇具有很好参考价值的文章主要介绍了【LeetCode-经典面试150题-day12】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

20.有效的括号

题意:

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

【输入样例】s="({})"

【输出样例】true

解题思路:

经典的栈思想,用数组模拟栈,从头开始遍历字符串,遇到左括号进栈,遇到右括号弹出栈顶,并匹配,看是否能匹配上,如果匹配不上直接return false;

class Solution {
    public boolean isValid(String s) {
        if(s.length() %2 ==1){
            //长度为奇数,肯定不匹配
            return false;
        }
        Map<Character,Character> map = new HashMap<Character,Character>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
        List<Character> stack = new ArrayList<>();
        for(int i=0;i<s.length();++i){
            if(!map.containsKey(s.charAt(i))){
                //左括号入栈
                 stack.add(s.charAt(i));
            }else{
                //右括号要出栈匹配
                //栈为空或者栈顶元素与当前右括号不匹配
                if(stack.isEmpty() || map.get(s.charAt(i)) != stack.get(stack.size()-1)){
                    return false;
                }
                //匹配上,要弹出栈顶元素
                stack.remove(stack.size()-1);
            }
            
        }
        return stack.isEmpty();
    }
}

时间: 击败了50.23%

内存: 击败了28.36%

71.简化路径

题意:

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/' 。
  • 最后一个目录名(如果存在)不能 以 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径 。

【输入样例】path="/home/"

【输出样例】"/home"

解题思路:

1. 根据‘/’将给定字符串进行分割,分割之后有三种情况:空字符串,一个点(.)和两个点(..);

2.遍历分割的字符串,将目录名存入到栈中。

遇到空字符串跳过,因为空字符串是由于多个/出现在一个;

3. 遇到'.'不处理,表示当前目录本身

4. 遇到'..‘弹出栈顶目录,切换到上一级

class Solution {
    public String simplifyPath(String path) {
        String[] splitPath = path.split("/");
        List<String> stack = new ArrayList<>();
        for(String current:splitPath){
            if("..".equals(current)){
                //出栈,切换到上一级目录,要不为空
                if(!stack.isEmpty()){
                    stack.remove(stack.size()-1);
                }
            }else if(current.length() > 0 && !".".equals(current)){
                //当前的字符串长度大于0,表示不是空字符串,当前的字符也不是·,进栈
                stack.add(current);
            }
        }
        //拼接,空的时候也要返回一个/
        StringBuffer result = new StringBuffer();
        if(stack.isEmpty()){
            result.append("/");
        }else{
            //不为空,一直读出,直到空
            int n = 0;
            while(n<stack.size()){
                result.append("/");
                result.append(stack.get(n));
                ++n;
            }
        }
        return result.toString();
    }
}

时间: 击败了94.43%

内存: 击败了77.54%

 155.最小栈

题意:

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

【输入样例】

["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

【输出样例】

[null,null,null,null,-3,null,0,-2]

解题思路:

这道题目初看,嗯好像没啥难点,其实最主要的是在获取最小值这个函数的实现;

刚拿到的时候,想着我就定义一个全局变量min,然后每次push的时候进行比较,这样就可以存储到最小的值了。但是,忽略了出栈的时候,保存的最小值可能会被弹出,这个时候,min怎么更新呢?

正确的做法是新开一个额外的栈,存储栈在剩余k个数据时的最小值;

1.minStack先存Integer.MAX_VALUE;

2.stack执行push操作的时候,minStack也要存储此时的最小值,Math.min(minStack.peek(), val);

3. stack执行pop操作的时候,minStack也要执行pop操作,这样才能做到一致。

class MinStack {
    Deque<Integer> stack;
    Deque<Integer> minStack;
    public MinStack() {
       stack = new LinkedList<Integer>(); 
       minStack = new LinkedList<Integer>(); 
       minStack.push(Integer.MAX_VALUE);
    }
    
    public void push(int val) {
        stack.push(val);
        minStack.push(Math.min(minStack.peek(), val));
    }
    
    public void pop() {
        stack.pop();
        minStack.pop();
    }
    
    public int top() {
       return stack.peek();
    }
    
    public int getMin() { 
       return minStack.peek();
    }
}

时间: 击败了95.54%

内存: 击败了48.09%

 150.逆波兰表达式求值

题意:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示

【输入样例】token=["2","1","+","3","*"]

【输出样例】9    (2+1)*3=9

解题思路:

逆波兰表达式,也叫后缀表达式,就是运算符在两个运算数后面,ab* --> a*b

1. 用栈实现,遇到是运算数,进栈

2. 遇到操作符+-*/ 的时候,弹出栈顶和次栈顶的值,注意,运算的顺序是 次栈顶 操作符 栈顶;计算完结果后要将计算结果存入栈中;

class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> num = new LinkedList<Integer>();
        int a,b,temp;
        for(String str : tokens){
            //注意,存入数据的时候,将其转成int形。方便计算
            if(isNumber(str)){
                num.push(Integer.parseInt(str));
            }else{
                b = num.pop();
                a = num.pop();
                switch(str){
                    case "+":
                        num.push(a+b);
                        break;
                    case "-":
                        num.push(a-b);
                        break;
                    case "*":
                        num.push(a*b);
                        break;
                    case "/":
                        num.push(a/b);
                        break;
                     
                }
            }
        }
        return num.peek();
    }
    public boolean isNumber(String str){
        return !("+".equals(str) ||"-".equals(str) ||"*".equals(str) ||"/".equals(str));
    }
}

时间: 击败了92.77%

内存: 击败了79.78%

 文章来源地址https://www.toymoban.com/news/detail-665827.html

到了这里,关于【LeetCode-经典面试150题-day12】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode-经典面试150题-day11】

    目录 128.最长连续序列  228.汇总区间  56.合并区间  57.插入区间  452.用最少数量的箭引爆气球   128.最长连续序列 题意: 给定一个未排序的整数数组  nums  ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为  O(n)   的算法

    2024年02月12日
    浏览(45)
  • 【LeetCode】挑战100天 Day4(热题+面试经典150题)

    LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。 LeetCode上的问题涵盖了

    2024年02月04日
    浏览(41)
  • LeetCode150道面试经典题-- 加一(简单)

    给你一个非负整数 x ,计算并返回  x  的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意: 不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1: 输入:x=4 输出:2   示例 2: 输入: x = 8 输出: 2 解释: 8 的

    2024年02月12日
    浏览(39)
  • LeetCode150道面试经典题-- 快乐数(简单)

    编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」  定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为  1,那么这个数就是快乐数。 如果

    2024年02月12日
    浏览(40)
  • Leetcode面试经典150题刷题记录 —— 矩阵篇

    Leetcod面试经典150题刷题记录-系列 Leetcod面试经典150题刷题记录——数组 / 字符串篇 Leetcod面试经典150题刷题记录 —— 双指针篇 本篇 Leetcod面试经典150题刷题记录 —— 矩阵篇 Leetcod面试经典150题刷题记录 —— 滑动窗口篇 Leetcod面试经典150题刷题记录 —— 哈希表篇 Leetcod面试

    2024年01月16日
    浏览(72)
  • Leetcode面试经典150题刷题记录 —— 数学篇

    Leetcode面试经典150题刷题记录-系列 Leetcod面试经典150题刷题记录——数组 / 字符串篇 Leetcod面试经典150题刷题记录 —— 双指针篇 Leetcod面试经典150题刷题记录 —— 矩阵篇 Leetcod面试经典150题刷题记录 —— 滑动窗口篇 Leetcod面试经典150题刷题记录 —— 哈希表篇 Leetcod面试经典

    2024年01月21日
    浏览(70)
  • LeetCode150道面试经典题-合并两个有序数组(简单)

    题目: 给你两个按 非递减顺序 排列的整数数组  nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对

    2024年02月14日
    浏览(44)
  • 【leetcode面试经典150题】29.三数之和(C++)

    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致) 给你一个整数数组 

    2024年04月13日
    浏览(41)
  • leetcode每日一题——189.轮转数组(面试经典150题)

    189. 轮转数组 - 力扣(LeetCode) 给定一个整数数组  nums ,将数组中的元素 向右轮转  k   个位置 ,其中  k   是非负数。 示例1: 示例2: 1 = nums.length = 105 -231 = nums[i] = 231 - 1 0 = k = 105        对题目进行分析可知,我们需要根据轮转量k,将数组后面的k个元素按照原来的顺

    2024年02月12日
    浏览(39)
  • 【leetcode面试经典150题】10.跳跃游戏 II(C++)

    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致) 给定一个长度为  n  的

    2024年04月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包