241. 为运算表达式设计优先级
作者:互联网
题目描述:
给你一个由数字和运算符组成的字符串 expression
,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。
示例:
输入:expression = "2*3-4*5" 输出:[-34,-14,-10,-10,10] 解释: (2*(3-(4*5))) = -34 ((2*3)-(4*5)) = -14 ((2*(3-4))*5) = -10 (2*((3-4)*5)) = -10 (((2*3)-4)*5) = 10
解题思路:
使用分治思想,以某一个运算符为界限,将表达式分为左右两个子表达式,分别求得左子表达式的所有结果与右子表达式的所有结果,使用作为中间界限的运算符对两个子表达式的结果进行组合,得到所有结果。如何求取子表达式的所有结果?使用递归,对子表达式进一步划分,直到子表达式只是一个数为止。
步骤:
- 首先对表达式进行预处理,分别提取出所有的数字和运算符;
- 使用一层for循环依次以某个运算符作为界限,对表达式进行切分,并存储作为界限的运算符 symbol;
- 分别求取左、右表达式的所有计算结果,存储到各自的结果数组 left[]、right[] 中;
- 对子表达式的所有结果进行组合:
代码实现:
/** * @param {string} expression * @return {number[]} */ var diffWaysToCompute = function(expression) { let sym = []; let nums = []; let str = ''; //对表达式进行预处理,分别提取出数字与运算符 for(let i=0;i<expression.length;i++){ let c = expression[i]; //遇到运算符就将前面数字提取到nums[]中,并重置str,同时提取运算符 if(c=='+'||c=='-'||c=='*'){ nums.push(parseInt(str)); str = ''; sym.push(c); }else{ str += c; //遇到数字就添加到字符串后面(应对"大于9的数字的位数有两位"的情况) } } nums.push(parseInt(str));//别忘了存储最后一个数字 return dfs(nums,sym); }; function dfs(nums,sym){ //递归终止条件:当子表达式只有一个数字的情况 if(nums.length==1){ return [nums[0]]; } let ans = []; //使用循环依次将sym[]中每一个运算符作为界限进行划分 for(let i=0;i<sym.length;i++){ let c = sym[i]; let left = f(nums.slice(0,i+1),sym.slice(0,i));//左子表达式的所有结果 let right = f(nums.slice(i+1),sym.slice(i+1));//右子表达式的所有结果 //使用两层循环进行组合 for(let j=0;j<left.length;j++){ for(let k=0;k<right.length;k++){ let res = 0; switch(c){ case '*': res = left[j]*right[k]; break; case '+': res = left[j]+right[k]; break; case '-': res = left[j]-right[k]; break; default: break; } ans.push(res); } } } return ans; }
示例的演算过程:
标签:10,优先级,结果,运算符,let,241,expression,表达式 来源: https://www.cnblogs.com/evil-shark/p/16434152.html