关闭

Basic CalculatorII

标签: 计算
131人阅读 评论(0) 收藏 举报
分类:

题目描述

Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
“3+2*2” = 7
” 3/2 ” = 1
” 3+5 / 2 ” = 5

题目解答

解题思路

如表达式:1+2-3*4/2+1。对于加减运算,与Basic Calculator类似,
可以直接将每个加减运算符前面的数字加入最终的结果中,
而对于乘除,需要先计算出乘法或者除法子表达式的值。—乘除直接计算
我们设置一个变量op表示当前的操作符,其中:

0:’+’或’-’
1:’*’
2:’/’
使用变量lastNum表示当前操作符前面的数字。

如果op = 1,那么计算就对运算符’*’前后两个数进行相乘,所得结果仍然保存在lastNum中。
如果op = 2,那么计算就对运算符’/’前后两个数进行相除,所得结果仍然保存在lastNum中。
如果op = 0,为加减运算。

没有括号操作变得简单

代码实现

public class Solution {
    public int calculate(String s) {
       if(s == null || s.length() == 0)
            return -1;

        int len = s.length();
        int result = 0;
        int num = 0;
        int lastNum = 0;
        int sign = 1;
        int op = 0;


        for(int i = 0; i < len; i++){
            char c = s.charAt(i);
            if(c >= '0' && c <= '9'){
                num = 0;
               //判断正数位数 递增 注意 s[i] not c
                while(i < len && s.charAt(i) >= '0' && s.charAt(i) <= '9'){
                    num = num*10 +(s.charAt(i) - '0');
                    i++;
                }
                i--;
                switch(op){
                    case 0:
                        lastNum = num;
                        break;
                    case 1:
                        lastNum *= num;
                        break;
                    case 2:
                        lastNum /= num;
                        break;
                }
            }else if(c == '+'){
                //之前的符号
                result += (sign*lastNum);
                op = 0;
                sign = 1;
            }else if(c == '-'){
                result += (sign*lastNum);
                op = 0;
                sign = -1;
            }else if(c == '*'){
                op = 1;
            }else if(c == '/'){
                op = 2;
            }
        }

        result += (lastNum*sign);

        return result;  
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42041次
    • 积分:1858
    • 等级:
    • 排名:千里之外
    • 原创:148篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    博客专栏
    最新评论