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; }

浙公网安备 33010602011771号