Leetcode 227. 基本计算器 II
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
这个题实际上考的是字符串处理。。。
对于这种只涉及加减乘除的表达式计算,其实可以维护两个变量a和b。设下一个数为nxt,操作符为op。若op为+,则令a = a + b, b = nxt,op为-同理。若op为*,则令b *= nxt,a保持不变,op为/同理。最后返回a + b即可。
所以难点在于把数字字符串和符号提取出来,还需要注意处理空格QAQ。注意转换字符串为数字记得开long long,虽然结果保证在int32范围内,但中间变量可能越界。
class Solution {
#define ll long long
public:
ll tran(string s) {//转换字符串为数字
ll ans = 0, mul = 1;
for(int i = s.size() - 1; i >= 0; i--) {
ans += (s[i] - '0') * mul;
mul *= 10;
}
return ans;
}
ll calculate(string s) {
vector<string> v;
int last = 0;
int pos = 0;
for(int i = s.size() - 1; i >= 0; i--) {//pos标记除去空格的最末尾的位置
if(s[i] >= '0' && s[i] <= '9') {
pos = i;
break;
}
}
if(pos == s.size() - 1) s = s + '!';
else s[pos + 1] = '!';//!标记末尾
for(int i = 0; i < s.size(); i++) {
if(s[i] >= '0' && s[i] <= '9') {//当前是数字
if(i == 0 || i - 1 >= 0 && !(s[i - 1] >= '0' && s[i - 1] <= '9')) last = i;//如果是新数字的开头打标记
continue;
}
if(!(s[i] >= '0' && s[i] <= '9') && (i - 1 >= 0 && s[i - 1] >= '0' && s[i - 1] <= '9')) {//当前是某个数字字符串的结尾
v.push_back(s.substr(last, i - last));//添加
}
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {//运算符
stringstream stream;
stream << s[i];
v.push_back(stream.str());
}
if(s[i] == '!') break;
}
ll a = 0, b = 0;
b = tran(v[0]);
for(int i = 1; i < v.size(); i++) {
if(v[i - 1] == "+") {
a = a + b;
b = tran(v[i]);
} else if(v[i - 1] == "-") {
a = a + b;
b = -tran(v[i]);
} else if(v[i - 1] == "*") {
b *= tran(v[i]);
} else if(v[i - 1] == "/") {
b /= tran(v[i]);
} else {
continue;
}
}
return a + b;
}
};