栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode-每日一题 282. 给表达式添加运算符 [Java实现]

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode-每日一题 282. 给表达式添加运算符 [Java实现]

给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target ,在 num 的数字之间添加 二元 运算符(不是一元)+、- 或 * ,返回所有能够得到目标值的表达式。

示例 1:

输入: num = "123", target = 6
输出: ["1+2+3", "1*2*3"] 


方法一:回溯

        由题意,每一次对数的操作(截取1~n位)都存在 + - * 三种运算可能,对于 + - 两种操作,我们之间将 计算总值+/-当前截取数值 即可获取新的总值,而对于 * 这一运算,由于其具有的优先级,我们还需维护一个变量储存上一位截取值才能得出乘法下新的总值。

        在示例代码中,我们维护一个 List 来便于对储存的字符串进行一系列的回溯操作(类似于一个栈,但比栈要更便捷

    private List result;
    private char[] nums;
    private int target;

    public List addOperators(String num, int target) {
        this.result = new ArrayList<>(1 << 3);
        this.nums = num.toCharArray();
        this.target = target;
        backtrace(0, 0, 0, new ArrayList<>(1 << 3));
        return result;
    }

    private void backtrace(int index, long preNumber, long correct, List store) {
        if (index == nums.length) {
            if (correct == target) {
                StringBuilder builder = new StringBuilder();
                store.forEach(builder::append);
                result.add(builder.toString());
            }
            return;
        }
        for (int i = index; i < nums.length; ++ i) {
            if (i != index && nums[index] == '0') break;
            long number = Long.parseLong(new String(nums, index, i-index+1));
            if (index == 0) {
                store.add(String.valueOf(number));
                backtrace(i+1, number, number, store);
                store.remove(store.size()-1);
            } else {
                store.add("+" + number);
                backtrace(i+1, number, correct+number, store);
                store.remove(store.size()-1);

                store.add("-" + number);
                backtrace(i+1, -number, correct-number, store);
                store.remove(store.size()-1);

                store.add("*" + number);
                long multi = preNumber*number;
                backtrace(i+1, multi, correct-preNumber+multi, store);
                store.remove(store.size()-1);
            }
        }
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327557.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号