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;
        }
    };
    
  • 相关阅读:
    【转载】.NET 2.0下简单的FTP访问程序
    [转贴]sqlserver连接oracle
    Lucene:QueryParser中操作符的疑惑
    DataSet与Xml相互转化
    SqlTransaction事务使用示例
    在非SqlServer数据库上实现MemberShip和Role功能(自定义MemberShipProvider和RoleProvider)
    c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸
    ArraySegment<T>泛型结构示例
    委托示例(利用委托对不同类型的对象数组排序)
    泛型List<T>使用示例
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14519842.html
Copyright © 2011-2022 走看看