专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
财宝宝  ·  @来去之间 ... ·  21 小时前  
湖北经视  ·  杨某颖(11月龄幼儿)、蒋某娣,当场死亡 ·  22 小时前  
财宝宝  ·  小时候看课本,色目人是什么意思? ... ·  2 天前  
广州房产  ·  只此小高层!海珠真神,出手了 ·  2 天前  
岱山岛印订阅号  ·  舟山房产界大动作!全新规定即将出台! ·  2 天前  
51好读  ›  专栏  ›  吴师兄学算法

小鹏三面,一道 Hard 结束

吴师兄学算法  · 公众号  ·  · 2024-04-27 20:30

正文

大家好,我是吴师兄。

一般来说,面试过程有个潜规则,如果面试官对你很满意,在算法面试环节往往会给你出一道简单题或者送分题,如果觉得不满意,则会让你手撕一道 Hard 题,让你觉得是因为这个环节表现不佳被拒。

有个网友在小鹏三面,遇到了 矩形面积 这道 Hard 题,没做出来,导致被拒。

底下评论大部分都是认为面试官就是不想要了,才出这样一道算法题。

有读者朋友在面试过程中手撕成功过这道算法题么?


继续今天的算法学习,来一个 Hard 的算法题: 基本计算器

一、题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

输入:s = "1 + 1"
输出:2

示例 2:

输入:s = " 2-1 + 2 "
输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

  • 1 <= s.length <= 3 * 105
  • s 由数字、 '+' '-' '(' ')' 、和 ' ' 组成
  • s 表示一个有效的表达式

二、题目解析

算法考察点

  1. 栈的应用:使用栈来处理括号的计算顺序。
  2. 字符串处理:对字符串表达式进行遍历和字符的转换。
  3. 计算逻辑:根据括号的计算顺序,正确计算表达式的结果。

算法思路

  1. 使用一个栈来存储数字和括号外的运算符。
  2. 从左到右遍历字符串表达式,依次处理每个字符:
  • 如果是数字,则将其转换为整数并入栈。
  • 如果是运算符,则更新当前的符号。
  • 如果是左括号,则将当前结果和符号入栈,并初始化结果和符号。
  • 如果是右括号,则将栈顶的符号和结果出栈,计算括号内的结果,并将结果与栈顶的结果相加。
  • 遍历完整个表达式后,栈顶元素即为计算结果。
  • 三、参考代码

    // 登录 AlgoMooc 官网获取更多算法图解
    // https://www.algomooc.com
    // 作者:程序员吴师兄
    // 代码有看不懂的地方一定要私聊咨询吴师兄呀
    // 基本计算器( LeetCode 224 ):https://leetcode-cn.com/problems/basic-calculator
    class Solution {
        public int calculate(String s) {

            // 使用栈来储存字符串表达式中的数字
            Stack stack = new Stack();

            // 为了方便计算,所有的操作都视为加法操作
            // 那么原先的减法操作就相当于是加一个负数
            // 默认都是正数
            int sign = 1;

            // 保存计算的结果
            int res = 0;

            // 获取字符串的长度,然后获取里面的每个字符
            int length = s.length();

            // 获取字符串里面的每个字符
            for (int i = 0; i 
                // 获取此时的字符
                char ch = s.charAt(i);

                // 如果当前字符是数字的话
                if (Character.isDigit(ch)) {

                    // 那么可以通过 - '0' 这个操作把字符转换为整数
                    // 相当于转换成了 ascii 码进行的数字运算
                    int value = ch - '0';

                    // 去查看当前字符的后一位是否存在
                    // 如果操作并且后一位依旧是数字,那么就需要把后面的数字累加上来

                    while (i + 1 1))){
                        
                        // i 向后移动,直到遇到非数字为止
                        i++;

                        // i 每向后移动一位,当前的值就需要乘以 10
                        // 比如 s 为 "123+456"
                        // 此时 i = 0,那么 value 为 1
                        // i = 1,那么 value 为 1 * 10 + 2 = 12
                        // i = 2,那么 value 为 12 * 10 + 3 = 123
                        value = value * 10 + s.charAt(i) - '0';

                    }

                    // 那么把获取到的数累加到结果 res 上
                    res = res + sign * value;

                  // 如果是 '+'
                } else if (ch == '+') {
                    
                    // 那么说明直接加一个正数
                    sign = 1;

                  // 如果是 '-'
                } else if (ch == '-') {

                    // 那么说明加一个负数
                    sign = -1;

                  // 如果是 '('
                } else if (ch == '('






    请到「今天看啥」查看全文