2023字节客服平台面试题——实现加法器,支持+-()四种运算符

这种面试题涉及到几个知识点:

1、字符串处理,比如字符串转数字,有些式子因为有很多个括号,每个括号之内又可以视为一个式子,所以可以递归运算;

2、一般括号匹配就涉及到单调栈

思路是这样的:

没有遇到(左括号之前就一直累加到sum,根据+/-变动符号,遇到左括号就将之前的结果压入栈,再压入左括号之前的符号,等遇到右括号再弹出符号。

C++代码如下:

#include <iostream>
#include <string>
#include <stack>

int calculate(std::string &str) {
    int sum = 0;
    // 这个栈用来保存遇到(之前的结果
    std::stack<int> nums;
    int num = 0, sign = 1;
    for (char c: str) {
        if (c >= '0' && c <= '9') {
            num = num * 10 + (c - '0');
        } else if (c == '+') {
            sum += num * sign;
            sign = 1;
            num = 0;
        } else if (c == '-') {
            sum += num * sign;
            sign = -1;
            num = 0;
        } else if (c == '(') {
            // (之前的结果和符号都放到栈里
            nums.push(sum);
            nums.push(sign);
            sum = 0;
            num = 0;
            sign = 1;
        } else if (c == ')') {
            // 栈顶的符号为对应(之前的符号
            int sign_ = nums.top();
            nums.pop();
            int num_ = nums.top();
            nums.pop();
            // sum是当前括号内累计的和
            sum += num * sign;
            sum = num_ + sum * sign_;
            num = 0;
            sign = 1;
        }
    }
    sum += sign * num;
    return sum;
}

int main() {
    std::string str = "((((((()))))))";
    std::cout<<calculate(str)<<'\n';
    return 0;
}

 

posted @ 2023-12-05 16:52  宇宙之母蔡依林  阅读(27)  评论(0)    收藏  举报