227. 基本计算器 II(力扣LeetCode)(官方代码 的基础 上 加递归 实现 有括号 和 加减乘除 的方法

注:本解法 适用(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结果:
227结果

224结果:
224结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值