问题:
给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。
示例 1:
输入:
num =
"123", target = 6
输出: ["1+2+3", "1*2*3"]
示例 2:
输入:
num =
"232", target = 8
输出: ["2*3+2", "2+3*2"]
示例 3:
输入:
num =
"105", target = 5
输出: ["1*0+5","10-5"]
示例 4:
输入:
num =
"00", target = 0
输出: ["0+0", "0-0", "0*0"]
示例 5:
输入:
num =
"3456237490", target = 9191
输出: []
提示:
1 <= num.length <= 10
num 仅含数字
-231 <= target <= 231 - 1
解答思路:
以下是使用 Java 语言解决此问题的步骤:
-
定义一个函数来计算表达式的值。
-
使用回溯法来生成所有可能的表达式。
-
在回溯过程中,根据当前数字和运算符计算表达式的值,并与目标值进行比较。
-
如果表达式的值等于目标值,则将其添加到结果列表中。
-
最终返回结果列表。
以下是完整的 Java 代码:
java
import java.util.ArrayList;
import java.util.List;
public class AddOperators {
public static List<String> addOperators(String num, int target) {
List<String> result = new ArrayList<>();
backtrack(num, target, 0, 0, 0, "", result);
return result;
}
public static void backtrack(String num, int target, int index, long prev, long curr, String expression, List<String> result) {
if (index == num.length()) {
if (curr == target) {
result.add(expression);
}
return;
}
for (int i = index; i < num.length(); i++) {
if (i!= index && num.charAt(index) == '0') {
break;
}
long value = Long.parseLong(num.substring(index, i + 1));
if (index == 0) {
backtrack(num, target, i + 1, value, value, expression + value, result);
} else {
backtrack(num, target, i + 1, prev, curr + value, expression + "+" + value, result);
backtrack(num, target, i + 1, -prev, curr - value, expression + "-" + value, result);
backtrack(num, target, i + 1, prev * value, curr - prev + prev * value, expression + "*" + value, result);
}
}
}
public static void main(String[] args) {
String num = "123";
int target = 6;
List<String> expressions = addOperators(num, target);
for (String expression : expressions) {
System.out.println(expression);
}
}
}
在上述代码中,'addOperators' 函数接受数字字符串 'num' 和目标值 'target' 作为输入。'backtrack' 函数用于回溯生成表达式。在回溯过程中,根据当前数字和运算符计算表达式的值,并与目标值进行比较。如果表达式的值等于目标值,则将其添加到结果列表中。
(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)