不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。
给你一个下标从 0 开始的字符串 expression ,格式为 “num1+num2” ,其中 num1 和 num2 表示正整数。
请你向 expression 中添加一对括号,使得在添加之后, expression 仍然是一个有效的数学表达式,并且计算后可以得到 最小 可能值。左括号 必须 添加在 ‘+’ 的左侧,而右括号必须添加在 ‘+’ 的右侧。
返回添加一对括号后形成的表达式 expression ,且满足 expression 计算得到 最小 可能值。如果存在多个答案都能产生相同结果,返回任意一个答案。
生成的输入满足:expression 的原始值和添加满足要求的任一对括号之后 expression 的值,都符合 32-bit 带符号整数范围。
示例 1:
输入:expression = "247+38"
输出:"2(47+38)"
解释:表达式计算得到 2 * (47 + 38) = 2 * 85 = 170 。
注意 "2(4)7+38" 不是有效的结果,因为右括号必须添加在 '+' 的右侧。
可以证明 170 是最小可能值。
示例 2:
输入:expression = "12+34"
输出:"1(2+3)4"
解释:表达式计算得到 1 * (2 + 3) * 4 = 1 * 5 * 4 = 20 。
示例 3:
输入:expression = "999+999"
输出:"(999+999)"
解释:表达式计算得到 999 + 999 = 1998 。
提示:
3 <= expression.length <= 10
expression 仅由数字 '1' 到 '9' 和 '+' 组成
expression 由数字开始和结束
expression 恰好仅含有一个 '+'.
expression 的原始值和添加满足要求的任一对括号之后 expression 的值,都符合 32-bit 带符号整数范围
题目要求其实很简单,就是我们可以在式子中加一个加一对括号,要求是括号必须在加号的两边,然后要我们求加括号后算出的结果为最小的式子。
总结一下就是式子可以写成n1(n2+n3)n4、(n2+n3)n4 或 n1(n2+n3) 这三种形式,我们只需要枚举每一种分割情况,然后记录最小值结果,维护最小值式子即可。
如示例1的"247+38"
,总共有这么几种情况:
2(47+38)
/**
* @param {string} expression
* @return {string}
*/
var minimizeResult = function (expression) {
const num = expression.split("+");
const num1 = num[0].toString();
const num2 = num[1].toString();
let res = parseInt(num[0]) + parseInt(num[1]);
let ans = "(" + expression + ")";
for (let i = 1; i <= num1.length; i++) {
let n1 = parseInt(num1.slice(0, i)),
n2 = parseInt(num1.slice(i)) || "";
for (let j = 0; j <= num2.length; j++) {
let n3 = parseInt(num2.slice(0, j) || Infinity),
n4 = parseInt(num2.slice(j));
let sum = n1 * (n2 + n3) * (n4 || 1);
if (n2 == "") sum = (n1 + n3) * (n4 || 1);
if (res > sum) {
if (n2 != "") ans = n1 + "(" + n2 + "+" + n3 + ")";
else ans = "(" + n1 + "+" + n3 + ")";
if (n4) ans += n4;
res = sum;
}
}
}
return ans;
};
关注公众号『前端也能这么有趣
』,获取更多有趣内容。
这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 ,平时也喜欢写些东西,既为自己记录 ,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 ,写错的地方望指出,定会认真改进 ,偶尔也会在自己的公众号『
前端也能这么有趣
』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 。