• 282 expression and operations添加运算符


    [抄题]:

    给定一个仅包含数字 0 - 9 的字符串和一个目标值,返回在数字之间添加了 二元 运算符(不是一元)+- 或 * 之后所有能得到目标值的情况。

    "123", 6 -> ["1+2+3", "1*2*3"] 
    "232", 8 -> ["2*3+2", "2+3*2"]
    "105", 5 -> ["1*0+5","10-5"]
    "00", 0 -> ["0+0", "0-0", "0*0"]
    "3456237490", 9191 -> []

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    1. 不知道怎么插缝:单独命名一个变量pos记录位数信息。这个还是要加上的,以前没用过
    2. 感觉要用012控制+_*,想得太麻烦了,没必要增加变量,直接分情况写3个表达式就行了
    3. if (i != pos && num.charAt(pos) == '0') { break; } 02,0233431这些情况需要break。此题特殊

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    本来是加上lastf的,变成乘法了,把原来加的减去即可

    分别用函数中的当前改变量、当前结果来表示,体现乘法时的特殊操作,改变量需要正负分明。改变量和结果不对应的时候,可以用两个变量来表示。

    [一刷]:

    1. 字符串的corner case中,没有实例化对象是null,有对象但为空值是length() = 0两种情况要分开,以前不理解。
    2. 当eval == target就符合题目的要求 可以退出了,没理解题目的目的。看清数据结构,不要瞎加对象。
    3. dfs中包括的dfs,利用其中的参数改变来进行recursion

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    [复杂度]:Time complexity: O(3^所有数字个数) Space complexity: O(3*所有数字个数)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    枚举型dfs, for循环出所有方法

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     224. Basic Calculator

    150. Evaluate Reverse Polish Notation 用stack控制进出

    241. Different Ways to Add Parentheses分治型(为啥不是枚举型?)DFS方法

    494. Target Sum DP所有方法、DFS所有方法

     [代码风格] :

    public class Solution {
        /*
         * @param num: a string contains only digits 0-9
         * @param target: An integer
         * @return: return all possibilities
         */
        public List<String> addOperators(String num, int target) {
            //corner case
            List<String> results = new ArrayList<>();
            if (num.length() == 0 || num == null) {
                return results;
            }
            dfs(num, "", results, target, 0, 0, 0);
            return results;
        }
        //dfs
        //corner case
        private void dfs(String num, String path, List<String> results, 
        int target, int pos, long eval, long multed) {
            //reach end
            if (pos == num.length()) {
                if (eval == target) {
                    results.add(path);
                }
                return;
            }
            //02,098
            for (int i = pos; i < num.length(); i++) {
                if (i != pos && num.charAt(pos) == '0') {
                    break;
                }
                long cur = Long.parseLong(num.substring(pos, i + 1));
                if (pos == 0) {
                    dfs(num, path + cur, results, target, i + 1, cur, cur);
                }else {
                    dfs(num, path + "+"+ cur, results, target, i + 1, eval + cur, cur);
                    dfs(num, path + "-"+ cur, results, target, i + 1, eval - cur, -cur);
                    dfs(num, path + "*"+ cur, results, target, i + 1, eval - multed + multed * cur, multed * cur);
                }
            }
        }
    }
    View Code
  • 相关阅读:
    Kubenetes环境搭建笔记
    Python+Robot Framework实现UDS诊断自动化测试
    Python实现CAN总线J1939报文接收、发送
    [转载]从SQL 2008 复制数据及对像到SQL 2000 的方法
    推荐移动应用:群落(Groupcells)——全球第一款基于图片组的近场社交电子商务平台
    [缓存]迅雷下载原理
    HP大中华区总裁孙振耀退休感言
    [缓存]HTTP协议中的TranferEncoding:chunked编码解析
    [转载]SQL 2008到2005和2000版本的转换
    [学习]SVM入门(一)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8457122.html
Copyright © 2020-2023  润新知