zoukankan      html  css  js  c++  java
  • [LeetCode][JavaScript]Expression Add Operators

    Expression Add Operators

    Given a string that contains only digits 0-9 and a target value, return all possibilities to add binary operators (not unary) +-, or * between the digits so they evaluate to the target value.

    Examples: 

    "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 -> []

    https://leetcode.com/problems/expression-add-operators/


    NP完全问题,还是要一个个试,与前一题思路相近:http://www.cnblogs.com/Liok3187/p/4823785.html

    每一轮都要拿一位,拿两位...直到最后(1+2+3+4, 12+3+4, 123+4),每个数都要试三种符号。

    麻烦的是四则运算有优先级,如果之前是加法(2+3),再碰到乘法的话(2+3*2)需要回退。

    开一个back的变量记录需要回退的数,分三种符号来处理。

    1.加法(1+2,之前的val是1, 这一轮做+2),如果之后碰到乘法,需要回退当前的数(2)。

    2.减法(1-2,之前的val是1, 这一轮做-2),如果之后碰到乘法,需要回退当前的数的相反数(-2)。

    3.乘法(1+2*3*4,之前的val是1+2*3=7, 这一轮做*4),需要回退的数是上一轮传过来的(2*3),这一轮的val是7 - (2*3) + (2*3) * 4。

    最后还要注意去掉以0开始的大于两位的数。

     1 /**
     2  * @param {string} num
     3  * @param {number} target
     4  * @return {string[]}
     5  */
     6 var addOperators = function(num, target) {
     7     var res = [];
     8     compute(num, "", 0, 0);
     9     return res;
    10 
    11     function compute(nums, exp, val, back){
    12         var tmp;
    13         if(nums === "" && val === target){
    14             res.push(exp);
    15         }else{
    16             for(var i = 1; i <= nums.length; i++){
    17                 var head = nums.substring(0, i);
    18                 var tail = nums.substring(i, nums.length);
    19                 var curr = parseInt(head) || 0;
    20                 if(head.length >= 2 && head[0] === "0"){
    21                     return;
    22                 }
    23                 if(exp === ""){
    24                     compute(tail, head, curr, curr);
    25                 }else{
    26                     compute(tail, exp + "+" + head, val + curr, curr);
    27                     compute(tail, exp + "-" + head, val - curr, -1 * curr);
    28                     compute(tail, exp + "*" + head, val - back + back * curr, back * curr);                    
    29                 }
    30             }
    31         }
    32     }
    33 };

    第一把想偷,只拼string不计算,最后调用恶名昭著的eval方法,妥妥的TLE,一样的复杂度,感觉是eval太花时间。

     1 /**
     2  * @param {string} num
     3  * @param {number} target
     4  * @return {string[]}
     5  */
     6 var addOperators_TLE = function(num, target) {
     7     var res = [];
     8     compute("", num);
     9     return res;
    10 
    11     function compute(exp, str){
    12         var tmp;
    13         if(str === ""){
    14             if(eval(exp) === target){
    15                 res.push(exp);
    16             }
    17         }else{
    18             for(var i = 1; i <= str.length; i++){
    19                 var head = str.substring(0, i);
    20                 var tail = str.substring(i, str.length);
    21                 if(head.length >= 2 && head[0] === "0"){
    22                     return;
    23                 }
    24                 if(exp === ""){
    25                     compute(head, tail);
    26                 }else{
    27                     compute(exp + "+" + head, tail);
    28                     compute(exp + "-" + head, tail);
    29                     compute(exp + "*" + head, tail);
    30                 }
    31             }
    32         }
    33     }
    34 };
  • 相关阅读:
    git的学习笔记
    软件工程概论第一周综合测验
    人月神话读后感
    软件工程概论通读第十一章
    软件工程概论通读第十章
    软件工程概论通读第九章
    软件工程概论通读第八章
    软件工程概论通读第七章
    软件工程概论通读第六章
    软件工程概论通读第五章
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4824775.html
Copyright © 2011-2022 走看看