LEET CODE 227.Basic CalculatorII

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.

Example 1:

Input: "3+2*2"
Output: 7
Example 2:

Input: " 3/2 "
Output: 1
Example 3:

Input: " 3+5 / 2 "
Output: 5
Note:

You may assume that the given expression is always valid.
Do not use the eval built-in library function.

这个题和basic calculator 不同在于没有括号而增加了乘法和除法运算.难度相比basic calculator低一点.计算的过程和思路在解答的注释过程中.时间复杂度为Θ(n).

    public static int calculateII(String s) {
    	/*
    	 * 思路:遍历每一个符号,遇到+,-就记录下来,并把上一个+,-的数计算到结果之中,
    	 * 遇到*,/也记录下来,并把上一个*,/的数计算到xnumber之中.
    	 */
        int sum = 0;
        int flag = 0;//0表示正1表示负
        int xflag = 0;//0表示*1表示/
        int number = 0;
        int xnumber = 1;
        s="0+"+s+"+";//因为延迟了一个运算符的特殊处理
        for(int i = 0; i < s.length();i++){
            char ch = s.charAt(i);
            switch(ch){
                case '+':
                    if(flag==0&&xflag==0)//+ *
                        sum+=(xnumber*number);
                    else if(flag==0&&xflag==1)//+ /
                        sum+=(xnumber/number);
                    else if(flag==1&&xflag==0)// - *
                        sum-=(xnumber*number);
                    else // - /
                        sum-=(xnumber/number);
                    number = 0;
                    flag = 0;
                    xflag = 0;//0表示*1表示/
                    xnumber = 1;
                    break;
                case '-':
                    if(flag==0&&xflag==0)//+ *
                        sum+=(xnumber*number);
                    else if(flag==0&&xflag==1)//+ /
                        sum+=(xnumber/number);
                    else if(flag==1&&xflag==0)// - *
                        sum-=(xnumber*number);
                    else // - /
                        sum-=(xnumber/number);
                    number = 0;
                    xflag = 0;//0表示*1表示/
                    xnumber = 1;
                    number = 0;
                    flag = 1;
                    break;
                case '*':
                	if(xnumber==1){//乘法运算第一个因子
                        xnumber*=number;
                	}else{//延迟运算符号处理
                		if(xflag == 0)xnumber *= number;
                    	else xnumber /= number;
                	}
                    xflag = 0;
                    break;
                case '/':
                    if(xnumber==1)//除法运算被除数
                        xnumber = number;
                    else{//延迟运算符号处理
                    	if(xflag == 0)xnumber *= number;
                    	else xnumber /= number;
                    }
                        
                    xflag = 1;
                    break;
                case ' ':  //空格不处理                  
                    break;
                default: //连续数字的处理
                    String str = "";
                    while(ch>='0'&&ch<='9'){
                    	str = str + ch;
                        if(i+1>=s.length())break;
                        ch=s.charAt(++i);
                    }
                    number = Integer.valueOf(str);
                    i--;
            }
        }
        return sum;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值