Loading

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;
    }
};
posted @ 2021-03-11 18:40  脂环  阅读(91)  评论(0编辑  收藏  举报