JAVA学习-练习试用Java实现“给表达式添加运算符”

问题:

给定一个仅包含数字 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 语言解决此问题的步骤:

  1. 定义一个函数来计算表达式的值。

  2. 使用回溯法来生成所有可能的表达式。

  3. 在回溯过程中,根据当前数字和运算符计算表达式的值,并与目标值进行比较。

  4. 如果表达式的值等于目标值,则将其添加到结果列表中。

  5. 最终返回结果列表。

以下是完整的 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过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

相关推荐
0566461 小时前
Python康复训练——常用标准库
开发语言·python·学习
极光代码工作室1 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
Leighteen1 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
0566461 小时前
Python康复训练——控制流与函数
开发语言·python·学习
名字还没想好☜2 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫2 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao3 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬3 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛3 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
早睡早起身体好1233 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全