算法笔记——左神进阶(例题)字符串加减乘除计算

字符串加减乘除计算

经典例题,这题的3点说明是降低了一点难度,不然需要考虑有效性和溢出等状况。
tips:在笔试面试时,关注容易出错的地方和边界条件,在刷题的过程中需要将特殊情况进行标记,多积累特殊的情况,面试官询问对于算法如何检查之类的可以先回答对数器,同时需要回答需要关注的特殊情况和边界条件。

【题目】
算法笔记——左神进阶(例题)字符串加减乘除计算_第1张图片

【思路】
整个式子分为两种情况:

  1. 没有括号:新建一个栈,将数字和符号都放到栈中,如果顶端的符号是+或者-,则此时可以放入数字,如果顶端字符是或者/,则此时将最后放入的或/和符号下的数字取出,然后与即将放入的字符进行运算,运算结果放入到栈中。
  2. 存在括号:如果遇见了括号,则从括号的下一个位置开始计算,直到遇到右括号或者到了字符串结尾结束。中间过程不考虑空间复杂度可以考虑当存在左括号的时候允许其新建栈,如果此时没有括号了,则又变成了第一种情况,如果中间还存在括号,则又再次经历第二种情况,最后一定会返回到没有括号的情况。将括号内运算结果同样当做一个小步,此时保存到栈中。

需要的返回值:
3. 停止的位置
4. 停止位置计算的结果是多少。

【代码】

//主函数,主函数最后只关心最后计算的数值,其他不关心
public static int getValue(String str){
	return value(str.toCharArray(),0)[0];
}
//返回值为数组,长度一定为2,arr[0]代表计算结果,arr[1]代表计算到了哪个位置
public static int[] value(char[] str,int i){
	//收集加减等字符
	LinkedList<String> que = new LinkedList<String>();
	int pre = 0;
	int[] bra = null;
	while(i<str.length && str[i] != ')'{
		//如果当前的字符为数字,则会将收集到的数字收集,并且变换成可以计算的十进制数字
		if(str[i]>='0' && str[i] < = '9'){ //如果继续是数字,值会变成前一个数字乘10,再加上当前数字
			pre = pre*10+str[i++]-'0';
			//此时else表示遇到的只有加减乘除四种运算的符号
		}else if(str[i] != '('){
			addNum(que,pre);
			que.addLast(String.valueOf(str[i++]));
			//加完数之和当前数值不再需要,所以在这里归零
			pre = 0;
		}else{
			//遇到了左括号,把与之配对的有括号中间的数值返回,并且数据跳转到右括号的下一位
			bra = value(str,i+1);
			pre = bra[0];
			i = bra[1] +1;
		}
	}
	addNum(que,pre);
	return new int[] { getNum(que),i};
}

你可能感兴趣的:(算法笔记)