zoukankan      html  css  js  c++  java
  • Leetcode 282.给表达式添加运算符

    给表达式添加运算符

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

    示例 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

    输出: []

    题目分析:

    此题一看就是要递归,不过递归会有很多边界条件要处理,也要注意递归的参数。

    加法,减法直接在之前的基础上处理

    不过乘法就麻烦一些了,需要修正之前的结果,减掉一个,再加上最新的乘积

    还要注意不能出现000这种数

    以及可能的越界

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class Solution {
     5     List<String> res;
     6     /**递归解决此问题*/
     7     public List<String> addOperators(String num, int target) {
     8         res=new ArrayList<String>();
     9         search(num,target,"",(long) 0,(long)0);
    10         return res;
    11     }
    12 
    13     /***
    14      * 递归的时候,要想好需要什么样的参数,什么时候返回
    15      * @param num 初始集合
    16      * @param target 目标值
    17      * @param tmp    当前集
    18      * @param cures  当前结果
    19      * @param prenum 上一次的结果,主要是为了用于乘法计算,因为优先级最高
    20      */
    21     public void search(String num,int target, String tmp,Long cures,long prenum)
    22     {
    23         if(target==cures&&num.length()==0)
    24         {
    25 
    26             res.add(new String(tmp));
    27             return ;
    28 
    29         }
    30         for(int i=1;i<=num.length();i++)
    31         {
    32             String cur=num.substring(0, i);
    33             /**去除掉00X的结果,但是允许单个0*/
    34             if(cur.length()>1&&cur.charAt(0)=='0')
    35                 return;
    36             /**因为有可能越界,所以使用long*/
    37             long curnum=Long.parseLong(cur);
    38             String sub=num.substring(i);
    39             /**第一个数的话不用添加符号*/
    40             if(tmp.length()==0)
    41             {
    42                 search(sub,target,cur,curnum,curnum);
    43             }
    44             else
    45             {
    46                 /**加法*/
    47                 search(sub,target,tmp+"+"+curnum,cures+curnum,curnum);
    48                 /**减法,注意当前结果值是-curnum*/
    49                 search(sub,target,tmp+"-"+curnum,cures-curnum,-curnum);
    50                 /**乘法*/
    51                 search(sub,target,tmp+"*"+curnum,(cures-prenum)+prenum*curnum,prenum*curnum);
    52             }
    53         }
    54     }
    55 }
  • 相关阅读:
    SQLHelper访问类
    visual studio 2017安装教程以及各类问题解决方案
    EasyUI表格删除多个表的多条数据
    配置Java环境JDK与jre
    javascript动态结算购物车
    Linux 命令--vi/vim/yum
    Linux 命令--磁盘管理
    Linux 命令--用户和用户组管理
    Linux 命令--文件与目录管理
    Linux 目录结构说明
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10204976.html
Copyright © 2011-2022 走看看