注:本解法 适用(224. 基本计算器)题解,后面的没会员 做不了题,不过224 和 227 都能 通过 的代码,实现 有括号 和 加减乘除 的方法 ,肯定 没问题
复习一下 227中 官方 的解法:
具体思路,看官方解法即可:
官方解法 (点击进入 查看)
class Solution{
public int calculate(String s){
char[] a=s.toCharArray();
int num=0;
int preSign='+';
Deque<Integer> b=new LinkedList<>();
for(int i=0;i<a.length;i++){
if(a[i]<='9' && a[i]>='0')
num=num*10+(a[i]-'0');
if( i==a.length-1 || ( (a[i]>'9' || a[i]<'0') && a[i]!=' ' ) ){
switch(preSign){
case('+'): b.push(num);break;
case('-'): b.push(-num);break;
case('*'): b.push(b.pop()*num);break;
case('/'): b.push(b.pop()/num);break;
}
num=0;
preSign=a[i];
}
}
int res=0;
while(!b.isEmpty()) res+=b.pop();
return res;
}
}
时间O(n)
空间O(n)
解法改造, 加递归, 实现 有括号 和 加减乘除 的方法:
思路:就是 把 括号 里 的 表达式, 递归计算,得出结果,赋给num,作为 数 存储, i 作为 全局变量。具体 看代码就 一目了然! 注意 一些 细节 处理好就行,我也是 调试改的,不过 思路没问题。
// 227 的 衍生 ,加() 递归调用
class Solution{
int i=0;
public int calculate(String s){
char[] a=s.toCharArray();
return helper(a);
}
public int helper( char[] a){
int num=0;
int preSign='+';
Deque<Integer> b=new LinkedList<>();
for(;i<a.length;i++){
if(a[i]<='9' && a[i]>='0')
num=num*10+(a[i]-'0');
if(a[i]=='(') {i++; num=helper(a);}
if( a[i]==')' || i==a.length-1 || ( (a[i]>'9' || a[i]<'0') && a[i]!=' ' ) ){
switch(preSign){
case('+'): b.push(num);break;
case('-'): b.push(-num);break;
case('*'): b.push(b.pop()*num);break;
case('/'): b.push(b.pop()/num);break;
}
num=0;
preSign=a[i];
}
if( a[i]==')') {
if(i<a.length-1) i++;
//不加判断 条件 的话,括号结尾 时,后面递归 返回,a[i]判断 就越界了
break;
}
}
int res=0;
while(!b.isEmpty()) res+=b.pop();
return res;
}
}
时间O(n)
空间O(n)
结果
【227. 基本计算器 II】 和【 224. 基本计算器 】 都能 通过
227结果:
224结果: