题目:
解析:
这题的解决思路是模拟运算过程,从左到右,读取数字和字符,做到累加,关键是如何解决遇到的乘号或者除号的问题,因为在遇到他们之前那个数字已经被累加或者减去了,此时需要减掉多加的部分(这个数可能是正值也可能是负值)。需要保存的值有:最后一次读到的符号、最后一个读到的符号的左右两个数、累计总和。最后还需要考虑末尾数字的累加问题。
过程分析:
刚开始默认sign为“+”,读到数字就把之前的结果乘10累加,读到符号就判断上一个符号是什么,如果是加号就让总和加上累计的cur值,如果是减号就减去cur值,并把cur变为pre;如果是乘号,需要减去之前错误累加的部分,再加上乘积,除号的处理也类似。读到i值超过下标后,结算最后的数据。
代码实现:
class Solution {
public int calculate(String s) {
int pre=0;
int cur=0;
int sum=0;
char sign='+';
char[] array=s.trim().toCharArray();
for(int i=0;i<=array.length;i++){
if(i!=array.length&&Character.isDigit(array[i])){
cur=cur*10+array[i]-'0';
}else{
if(i!=array.length&&array[i]==' '){
continue;
}else if(sign=='+'){
sum+=cur;
pre=cur;
}else if(sign=='-'){
sum-=cur;
pre=-cur;
}else if(sign=='*'){
sum=sum-pre+pre*cur;
pre=pre*cur;
}else if(sign=='/'){
sum=sum-pre+pre/cur;
pre=pre/cur;
}
cur=0;
if(i!=array.length)
sign=array[i];
}
}
return sum;
}
}