本篇内容介绍了“C + +实现添加括号的不同方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
添加括号的不同方式
给定一个字符串的数字和运算符,返回所有可能结果计算所有可能的不同组数字和运算符的方法。有效的经营者断开连接;+,安康;以及*。
示例1:输入:
“2-1-1"
引用>输出:
(0, 2)
引用>解释:
((2 - 1) 1)=0
(2 - (1 - 1))=2示例2:
输入:“2 * 3 - 4 * 5“
引用>
输出:[-34、-14、-10、-10、10]
解释:
(2 * (3 - (4 * 5)))=-34
((2 * 3) - (4 * 5))=-14
((2 * (3 - 4)) * 5)=-10
(2 * ((3 - 4) * 5))=-10
(((2 * 3) 4) * 5)=10这道题让给了一个可能含有加减乘的表达式,让我们在任意位置添加括号,求出所有可能表达式的不同值。这道题乍一看感觉还蛮难的,给人的感觉是既要在不同的位置上加括号,又要计算表达式的值,结果一看还是道介质的题,直接尼克杨问号脸? !遇到了难题不要害怕,从最简单的例子开始分析,慢慢的找规律,十有八九就会在分析的过程中灵光一现,找到了破题的方法。这道题貌似默认输入都必须是合法的,虽然题目中没有明确的指出这一点,所以我们也就不必进行有效的验证了。先从最简单的输入开始,若输入是空串,那就返回一个空数组。若输入是一个数字的话,那么括号加与不加其实都没啥区别,因为不存在计算,但是需要将字符串转为整型数,因为返回的是一个整型数组。当然,输入是一个单独的运算符这种情况是不存在的,因为前面说了这道题默认输入的合法的。下面来看若输入是数字和运算符的时候,比如“1 + 1”;这种情况,那么加不加括号也没有任何影响,因为只有一个计算,结果一定是2。再复杂一点的话,比如题目中的例子1,输入是“2-1-1"时,就有两种情况了,(2)1和2 -(1 - 1),由于括号的不同,得到的结果也不同,但如果我们把括号里的东西当作一个黑箱的话,那么其就变为(1),和2 -(),其最终的结果跟括号内可能得到的值是息息相关的,那么再一般一点,实际上就可以变成()?()这种形式,两个括号内分别是各自的表达式,最终会分别计算得到两个整型数组,中间的问号表示运算符,可以是加,减,或乘。那么问题就变成了从两个数组中任意选两个数字进行运算,瞬间变成我们会做的题目了有木有?而这种左右两个括号代表的黑盒子就交给递归去计算,像这种分成左右两坨的模式就是大名鼎鼎的分治法分治了,是必须要掌握的一个神器。类似的题目还有之前的那道,独特的二叉搜索树II 用的方法一样,用递归来解,划分左右子树,递归构造。
好,继续来说这道题,我们不用新建递归函数,就用其本身来递归就行,先建立一个结果res数组,然后遍历中输入的字符,根据上面的分析,我们希望在每个运算符的地方,将输入分成左右两部分,从而扔到递归中去计算,从而可以得到两个整型数组左和右,分别表示作用两部分各自添加不同的括号所能得到的所有不同的值,此时我们只要分别从两个数组中取数字进行当前的运算符计算,然后把结果存到res中即可。当然,若最终结果res中还是空的,那么只有一种情况,输入本身就是一个数字,直接转为整型存入结果res中即可,参见代码如下:
解法一:
class Solution { 公众: ,,,vector, diffWaysToCompute (string 输入),{ ,,,,,,,vector , res; ,,,,,,,for (int 小姐:=,0;,小姐:& lt;, input.size ();, + + i), { ,,,,,,,,,,,if (输入[我],==,& # 39;+ & # 39;,| |,输入[我],==,& # 39;& # 39;,| |,输入[我],==,& # 39;* & # 39;),{ ,,,,,,,,,,,,,,,vector , left =, diffWaysToCompute (input.substr(0,,我)); ,,,,,,,,,,,,,,,vector , right =, diffWaysToCompute (input.substr(小姐:+,- 1)); ,,,,,,,,,,,,,,,for (int j =, 0;, j & lt;, left.size ();, + + j), { ,,,,,,,,,,,,,,,,,,,for (int k =, 0;, k & lt;, right.size ();, + + k), { ,,,,,,,,,,,,,,,,,,,,,,,if (输入[我],==,& # 39;+ & # 39;),res.push_back(左[j], +, [k]); ,,,,,,,,,,,,,,,,,,,,,,,else if (输入[我],==,& # 39;& # 39;),res.push_back(左[j],安康;对[k]); ,,,,,,,,,,,,,,,,,,,,,,,else res.push_back(左[j], *,正确的[k]); ,,,,,,,,,,,,,,,,,,,} ,,,,,,,,,,,,,,,} ,,,,,,,,,,,} ,,,,,,,} ,,,,,,,if (res.empty ()), res.push_back (stoi(输入); ,,,,,,,return res; ,,,} }; c++实现添加括号的不同方式