其他分享
首页 > 其他分享> > 241. 为运算表达式设计优先级

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

 

解题思路:

  使用分治思想,以某一个运算符为界限,将表达式分为左右两个子表达式,分别求得左子表达式的所有结果右子表达式的所有结果,使用作为中间界限的运算符对两个子表达式的结果进行组合,得到所有结果。如何求取子表达式的所有结果?使用递归,对子表达式进一步划分,直到子表达式只是一个数为止。

 

步骤:

  1. 首先对表达式进行预处理,分别提取出所有的数字和运算符;
  2. 使用一层for循环依次以某个运算符作为界限,对表达式进行切分,并存储作为界限的运算符 symbol
  3. 分别求取左、右表达式的所有计算结果,存储到各自的结果数组 left[]、right[] 中;
  4. 对子表达式的所有结果进行组合:   

 

代码实现:

/**
 * @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