问题地址:https://leetcode.com/problems/different-ways-to-add-parentheses/description/
题意: 给个不带括号的运算表达式,返回加上各种括号后可能的结果数组。
Example 1
Input: "2-1-1".
((2-1)-1) = 0
(2-(1-1)) = 2
Output: [0, 2]
Example 2
Input: "2*3-4*5"
(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
Output: [-34, -14, -10, -10, 10]
思路: 利用嵌套 以运算符为分隔符,循环每个分隔符,左右分为2个运算式,各自嵌套调用。
注意点: js利用eval计算,小心负数情况,在运算数外边加层括号,否则'1--2'这样的eval运算会出错。
js代码:
/**
* @param {string} input
* @return {number[]}
*/
var diffWaysToCompute = function(input) {
var nums = input.match(/\d+/g);
var operators = input.match(/\+|-|\*/g);
if(nums.length <= 2){ // 只有2个运算数字
return [eval(input)];
}
else if(nums.length <= 3){ // 有3个运算数字
var arr = [];
arr.push(eval('(' + '(' + nums[0] + ')' + operators[0] + '(' + nums[1] + ')' + ')' + operators[1] + '(' + nums[2] + ')'));
arr.push(eval('(' + nums[0] + ')' + operators[0] + '(' + '(' + nums[1] + ')' + operators[1] + '(' + nums[2] + ')' + ')'));
return arr;
}
else{
var arr = [];
for(var i = 0;i < operators.length; ++i){
var leftStr = '', rightStr = '', operator = operators[i];
for(var j = 0; j <= i; ++j){
leftStr += nums[j];
if(j < i){
leftStr += operators[j];
}
}
for(var j = i + 1; j <= operators.length; ++j){
rightStr += nums[j];
if(j < operators.length){
rightStr += operators[j];
}
}
var leftRes = diffWaysToCompute(leftStr);
var rightRes = diffWaysToCompute(rightStr);
var totalRes = [];
for(var kk = 0; kk < leftRes.length; ++kk){
for(var pp = 0; pp < rightRes.length; ++pp){
totalRes.push(eval('(' + leftRes[kk] + ')' + operator + '(' + rightRes[pp] + ')'));
}
}
arr = arr.concat(totalRes);
}
return arr;
}
};