题目描述
给你一个下标从 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 带符号整数范围
解法
方法一:枚举左右括号的插入位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | class Solution:
def minimizeResult(self, expression: str) -> str:
l, r = expression.split("+")
m, n = len(l), len(r)
mi = inf
ans = None
for i in range(m):
for j in range(n):
c = int(l[i:]) + int(r[: j + 1])
a = 1 if i == 0 else int(l[:i])
b = 1 if j == n - 1 else int(r[j + 1 :])
if (t := a * b * c) < mi:
mi = t
ans = f"{l[:i]}({l[i:]}+{r[: j + 1]}){r[j + 1:]}"
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | class Solution {
public String minimizeResult(String expression) {
int idx = expression.indexOf('+');
String l = expression.substring(0, idx);
String r = expression.substring(idx + 1);
int m = l.length(), n = r.length();
int mi = Integer.MAX_VALUE;
String ans = "";
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
int c = Integer.parseInt(l.substring(i)) + Integer.parseInt(r.substring(0, j + 1));
int a = i == 0 ? 1 : Integer.parseInt(l.substring(0, i));
int b = j == n - 1 ? 1 : Integer.parseInt(r.substring(j + 1));
int t = a * b * c;
if (t < mi) {
mi = t;
ans = String.format("%s(%s+%s)%s", l.substring(0, i), l.substring(i),
r.substring(0, j + 1), r.substring(j + 1));
}
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 | function minimizeResult(expression: string): string {
const [n1, n2] = expression.split('+');
let minSum = Number.MAX_SAFE_INTEGER;
let ans = '';
let arr1 = [],
arr2 = n1.split(''),
arr3 = n2.split(''),
arr4 = [];
while (arr2.length) {
(arr3 = n2.split('')), (arr4 = []);
while (arr3.length) {
let cur = (getNum(arr2) + getNum(arr3)) * getNum(arr1) * getNum(arr4);
if (cur < minSum) {
minSum = cur;
ans = `${arr1.join('')}(${arr2.join('')}+${arr3.join('')})${arr4.join('')}`;
}
arr4.unshift(arr3.pop());
}
arr1.push(arr2.shift());
}
return ans;
}
function getNum(arr: Array<string>): number {
return arr.length ? Number(arr.join('')) : 1;
}
|