zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    【转】ImageView的Scaletype参数设置
    android抓包工具——使用fiddler4在安卓手机抓包
    Java中JNI的使用详解第一篇:HelloWorld
    A/libc:fatal signal 11(SIGSEGV).code 1, fault addr 0x0 in tid 26488 (VideoEncoder)
    Android修改默认SharedPreferences文件的路径,SharedPreferences常用工具类
    android下asynchttp库对于session的支持
    routeros的配置资料
    Mac下关于——你不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。文件的删除
    nginx的https配置
    ros的相关link
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14519842.html
Copyright © 2011-2022 走看看