282. Expression Add Operators

目录

  • 题目理解
  • 分析
    • 第一步:dfs获得所有表达式
    • 第二步:计算结果
    • 先计算加减法
    • 计算乘法
    • 时间复杂度
    • 进一步优化

题目理解

输入:一个字符串num,一个int target。输入num只包含数字。
规则:可以给num中包含的数字之间任务添加二目运算符:+ - *,使得表达式的值等于target。
输出:所有可能的符合条件的表达式。

示例1:num=“123”, target=6
输出:[“1+2+3”, “123”]

示例2:num=“232”, target=8
输出:[“23+2", "2+32”]

示例3:num = “105”, target = 5
输出: [“1*0+5”,“10-5”]

分析

从示例中可以看到我们可以在每一个数字之间加运算符,而数字可以是一位数字1、2、3,也可以是两位、三位数字:12、32、123。那么我们可以把1和2连在一起认为是第四种操作。

这道题目看了官方的解答和花花酱的视频,依然云里雾里。一直到看了windliang的解法终于想明白了 。

解题思路是回溯法。每次添加一个操作符和一个数字。以num=123为例。下图是部分递归树。每条路径可以获得一个表达式。
在这里插入图片描述

第一步:dfs获得所有表达式

第一步我们使用dfs遍历打印出所有可能的表达式。注意第一个数字比较特别,只加数字,不加操作符。

class Solution {private String num;private int target;public List<String> addOperators(String num, int target) {this.num = num;this.target  = target;dfs(0,"");return null;}private void dfs(int start,String expr){if(start == num.length()){System.out.println(expr);return;}for(int  i = start ;i<num.length();i++){String t = num.substring(start,i+1);if(start == 0){dfs(i+1,t);}else{dfs(i+1,expr+"+"+t);dfs(i+1,expr+"-"+t);dfs(i+1,expr+"*"+t);}}}
}

使用num='123’做测试,得到输出1+2+3 1+2-3 1+2*3 1-2+3 1-2-3 1-2*3 1*2+3 1*2-3 1*2*3 1+23 1-23 1*23 12+3 12-3 12*3 123

第二步:计算结果

有了表达式,可以在每次表达式变化的时候计算表达式的结果。运算包括加法、减法、乘法。因为乘法优先级高,最后再处理。我们先看看怎么计算加减法。

先计算加减法

我们在上面递归树的每个节点加一个结果dfs(n,expr,value)。每个节点在计算表达式的值的时候,需要拿上一个表达式的结果与当前数字n做操作。
在这里插入图片描述

例如计算1+2+3

表达式上一步valuevalue
11
1+211+2=3
1+2+333+3=6

例如计算1-2+3

表达式上一步valuevalue
11
1-211-2=-1
1-2+3-1-1+3=2

在计算加减法的时候,只需要保存上一步的表达式的值即可。

class Solution {private String num;private int target;private List<String> result;public List<String> addOperators(String num, int target) {this.num = num;this.target  = target;result = new ArrayList<String>();dfs(0,"",0);return result;}private void dfs(int start,String expr,long value){if(start == num.length()){System.out.println(expr+" "+value);if(value == target){}return;}for(int  i = start ;i<num.length();i++){String t = num.substring(start,i+1);long n = Long.parseLong(t);if(start == 0){dfs(i+1,t,n);}else{dfs(i+1,expr+"+"+t,value+n);dfs(i+1,expr+"-"+t,value-n);dfs(i+1,expr+"*"+t,value*n);}}}
}

查看打印结果:1+2+3=6 1+2-3=0 1+2*3=9能够发现加法减法是正确的,乘法计算错了。

计算乘法

以1+2*3为例。

表达式上一步valuevalue
1+211+2=3
1+2*333*3=9

这是计算过程。我们不应该先算加法。我们需要记录下上一步的操作数preOperand,先在结果中减去preOperand。然后preOperand在乘以当前数字。即:val-preOperand + preOperand*n=3-2+2x3=7。计算结果正确。

如果上一步是减法,和上面的过程类似。例如1-2*3。preOperand = 3,val = -1。计算:-1-(-2)+(-2)*3=-5。

如果上一步是减法。例如543。preOperand = 5x4=20,val = 20。计算:20-20+20*3 = 60。也就是说上一步乘法的操作数preOperand = 5x4=20。这样公式就统一了。

至此解答完毕。

class Solution {private String num;private int target;private List<String> result;public List<String> addOperators(String num, int target) {this.num = num;this.target  = target;result = new ArrayList<String>();dfs(0,"",0,0);return result;}private void dfs(int start,String expr,long value,long preOperand){if(start == num.length()){//System.out.println(expr+" "+value);if(value == target){result.add(expr);}return;}for(int  i = start ;i<num.length();i++){String t = num.substring(start,i+1);if(t.charAt(0)=='0' && i>start) break;long n = Long.parseLong(t);if(n > Integer.MAX_VALUE) break;if(start == 0){dfs(i+1,t,n,n);}else{dfs(i+1,expr+"+"+t,value+n,n);dfs(i+1,expr+"-"+t,value-n,-n);dfs(i+1,expr+"*"+t,value-preOperand+preOperand*n,preOperand*n);}}}
}

时间复杂度

在字符串的两个数字之间有4种操作。n个字符串有n-1个空格,所以时间复杂度是O(4n−1)O(4^{n-1})O(4n1)

进一步优化

在计算 表达式expr,每次有字符串相加操作。可以使用StringBuilder。可以加快速度。链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring学习(52):工厂方法创建bean对象

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

com.alibaba.fastjson.JSONObject cannot be cast to XXX异常解决

项目开发中遇到过几次这个问题&#xff0c;所以记录一下&#xff0c;代码如下&#xff1a; 1 PostMapping("/save-files") 2 public void addFiles(RequestBody List<AddFileRecordRequestDto> fileRecords) 3 { 4 LoginInfo loginInfosession…

spring mvc学习(2):spring jar包下载

jstl的jar包的下载 我们在使用spring框架的时候导入jstl标签库需要使用到jstl的jar包&#xff0c;假如没有加入到eclipse的lib目录下&#xff0c;使用alt /的时候不会有提示&#xff0c;所以我们需要把这个jar包加进来 首先登陆网址&#xff1a;http://tomcat.apache.org/ta…

EF框架学习(5)---EF中的在线和离线场景

EF中的持久性场景 使用EF实现实体持久化&#xff08;保存&#xff09;到数据库有两种情况&#xff1a;在线场景和离线场景。 1.在线场景 在线场景中&#xff0c;context是同一个上下文实例&#xff08;从DbContext派生&#xff09;&#xff0c;检索和保存实体都通过同一个conte…

spring mvc学习(3):建立第一个动态web项目

intellij idea创建第一个动态web项目 我以2018版的intellij idea为例 一.创建JavaWeb 1.第一步 点击左上角的File-->New-->Project 2.第二步 1.找到Java Enterprise之后&#xff0c;在Application Sever中找到自己的Tomcat&#xff0c;同时勾选中Web Application 2.…

Git:(1)简介

Git是一个开源的分布式版本控制系统&#xff0c;分布式相比集中式的最大区别是Git没有“中央服务器”&#xff0c;每位开发者都可以通过克隆&#xff08;git clone&#xff09;远程库&#xff0c;在本地机器上存储一个完整的Git仓库&#xff0c;还可以把代码的修改提交到本地库…

(专题二)01 矩阵的处理-特殊矩阵

有哪些特殊矩阵&#xff1f; 通用的特殊矩阵 zeros函数 &#xff1a;产生全0矩阵 产生五行五列的随机矩阵A&#xff0c;其值是10--99的整数 产生均值0.6&#xff0c;方差0.1的五行五列正态矩阵B 产生五阶单位阵 验证等式成立 ones函数 &#xff1a;产生全1矩阵 eye函数 &…

Git(2):安装和使用

Git安装和使用 刚开始用git的小白适用&#xff0c;&#xff0c;转自http://www.cnblogs.com/qijunjun/p/7137207.html 实际项目开发中&#xff0c;我们经常会用一些版本控制器来托管自己的代码&#xff0c;今天就来总结下Git的相关用法&#xff0c;废话不多说&#xff0c;直接…

设计模式(二) 模板方法

模板方法模式——在一个抽象类中定义一个操作中的算法骨架&#xff0c;而将一些步骤延迟到子类中去实现&#xff08;对应于我们根据自己的情况向模板填充内容&#xff09;。模板方法使得子类可以不改变一个算法的结构前提下&#xff0c;重新定义算法的某些特定步骤&#xff0c;…

33. Search in Rotated Sorted Array

文章目录题目二分解题81 Search in Rotated Sorted Array II题目 输入&#xff1a;一个按升序排序的数组nums&#xff0c;但是这个数组在某个位置被旋转了。(例如., 原始数组是[0,1,2,4,5,6,7]&#xff0c;旋转后就变成 [4,5,6,7,0,1,2])。第二个输入是一个int target。 输出&…

第七十期:2019年度Java开发者路线图

本文将向大家展示了一张Java开发者路线图。该路线图在保持简单可行的基础上&#xff0c;介绍了各种具有业界标准、且方便多数人遵循的工具和程序库。 作者&#xff1a;陈峻 许多Java开发人员都希望通过某种Java成长路线图&#xff0c;来解答有关&#xff1a;该学习哪些技术&am…

常见的软件

重装完系统后&#xff0c;会有不少软件需要重装&#xff0c;这边简单列一下自己需要下载安装的软件。 1. 首先下载一个浏览器&#xff0c;我这边下载的是谷歌浏览器。&#xff08;不过现在的edge还是挺好用的&#xff09; 下载安装完可以修改启动时的网址和默认搜索引擎。&…

第七十一期:管理 | 技术Leader:选OKR还是KPI?

除了 KPI&#xff0c;考核员工还有什么方式?OKR 是一种简单的管理方法&#xff0c;但是对于其误解和各种疑惑却很多。 作者&#xff1a;燕标 除了 KPI&#xff0c;考核员工还有什么方式?OKR 是一种简单的管理方法&#xff0c;但是对于其误解和各种疑惑却很多。 图片来自 Pe…

153. Find Minimum in Rotated Sorted Array

文章目录1题目理解2 二分分治法2.1至少有一部分是有序的2.2 示例2.3 编码3 只有二分1题目理解 输入&#xff1a;一个按升序排序的数组nums&#xff0c;但是这个数组在某个位置被旋转了。(例如., 原始数组是[0,1,2,4,5,6,7]&#xff0c;旋转后就变成 [4,5,6,7,0,1,2])。 输出&a…

JS之onsubmit事件与组织事件外延

on是监听的意思 阻止事件发生&#xff1a;1、return false  2、e.preventDefault()适用于onsubmit outer外部  inner内部 event.stopPropagation()阻止事件向外层div传播 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&…

第七十二期:Visual Studio Online 终于公开上线了

盼望已久的 Visual Studio Online 终于上线了。今年 5 月份&#xff0c;微软在 Build 2019 开发者大会上宣布了 Web 版本的 VS Code&#xff0c;即 Visual Studio Online。当时微软释出的是 Private Preview 版本&#xff0c;仅允许开发者申请试用。 作者&#xff1a;佚名 盼望…

154. Find Minimum in Rotated Sorted Array II

文章目录题目理解二分分治只有二分154是 153的升级版本。题目理解 输入&#xff1a;一个按升序排序的数组nums&#xff0c;但是这个数组在某个位置被旋转了。(例如., 原始数组是[0,1,2,4,5,6,7]&#xff0c;旋转后就变成 [4,5,6,7,0,1,2])。注意&#xff1a;这个数组可能包含重…

@ResponseBody注解學習

轉載自https://www.cnblogs.com/qiankun-site/p/5774325.html這篇博客 本文僅是爲了自學整理知識點 ResponseBody 作用 將controller的方法返回的對象通過適當的轉換器轉換爲指定的格式之後&#xff0c;寫入到response對象的body區&#xff0c;通常用來返回JSON數據或者是XML數…

spring mvc学习(4):第一个spring mvc项目

一个Spring MVC的项目如何创建&#xff1f;请看这里。 代码编辑器&#xff1a;Intellij IDEA 请提前在电脑上配置好自己的tomcat&#xff01; 该文属于小白教程&#xff0c;适合初学者。 1 创建Spring MVC项目 第一步&#xff0c;点击新建项目。 第二步&#xff0c;选择Sp…

spring mvc学习(5):IDEA修改背景颜色大全

路径为File->settings->Editor->Color Scheme可以设置软件默认颜色&#xff0c;旁边的小齿轮添加颜色名字 IDEA设置一张背景图片,路径&#xff1a;File->Settings->Appearance&Behavior->Appearance 手动设置护眼绿的RGB颜色 路径&#xff1a;File->…