摘要:思路與算法這是經(jīng)典的分治法。我們將算式從一個(gè)操作符的位置分割開,并分別得出左邊和右邊算式所有可能的值。再將左右的值分別按照操作符進(jìn)行計(jì)算。將已經(jīng)遍歷過的結(jié)果存入緩存中,如果碰到重復(fù)的計(jì)算式,就可以直接獲取其所有可能的值。
題目要求
Given a string of numbers and operators, return all possible results from computing all the different possible ways to group numbers and operators. The valid operators are +, - and *. Example 1 Input: "2-1-1". ((2-1)-1) = 0 (2-(1-1)) = 2 Output: [0, 2] Example 2 Input: "2*3-4*5" (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 Output: [-34, -14, -10, -10, 10]
現(xiàn)在有一個(gè)字符串形式的算式,求該算式在任意位置加上任意數(shù)量的括號(hào)后能夠得出的所有可能的值。
思路與算法這是經(jīng)典的分治法。我們將算式從一個(gè)操作符的位置分割開,并分別得出左邊和右邊算式所有可能的值。再將左右的值分別按照操作符進(jìn)行計(jì)算。這里通過遞歸實(shí)現(xiàn)。
public ListdiffWaysToCompute(String input) { return diffWaysToCompute(input, 0, input.length()); } public List diffWaysToCompute(String input, int startIndex, int endIndex){ boolean isDigit = true; List result = new ArrayList (); for(int i = startIndex ; i leftValue = diffWaysToCompute(input, startIndex, i); List rightValue = diffWaysToCompute(input, i+1, endIndex); result.addAll(compute(leftValue, rightValue,cur)); } } if(isDigit){ result.add(Integer.parseInt(input.substring(startIndex, endIndex))); } return result; } public List compute(List leftValue, List rightValue, char operator){ switch(operator){ case "+" : return add(leftValue, rightValue); case "-" : return minus(leftValue, rightValue); case "*" : return multiply(leftValue, rightValue); } return new ArrayList<>(); } public List add(List leftValue, List rightValue){ List result = new ArrayList (); for(int left : leftValue){ for(int right : rightValue){ result.add(left + right); } } return result; } public List minus(List leftValue, List rightValue){ List result = new ArrayList (); for(int left : leftValue){ for(int right : rightValue){ result.add(left - right); } } return result; } public List multiply(List leftValue, List rightValue){ List result = new ArrayList (); for(int left : leftValue){ for(int right : rightValue){ result.add(left * right); } } return result; }
提高性能的方法是通過Map實(shí)現(xiàn)緩存。將已經(jīng)遍歷過的結(jié)果存入緩存中,如果碰到重復(fù)的計(jì)算式,就可以直接獲取其所有可能的值。
Map> cache = new HashMap >(); public List diffWaysToCompute_withCache(String input){ if(cache.containsKey(input)) return cache.get(input); List result = new ArrayList (); boolean isDigit = true; for(int i = 0 ; i leftValues = diffWaysToCompute_withCache(input.substring(0, i)); List rightValues = diffWaysToCompute_withCache(input.substring(i+1)); for(Integer left : leftValues){ for(Integer right : rightValues){ switch(cur){ case "+" : result.add(left + right); break; case "-" : result.add(left - right); break; case "*" : result.add(left * right); break; } } } } } if(isDigit){ result.add(Integer.parseInt(input));} cache.put(input, result); return result; }
想要了解更多開發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/61940.html
摘要:思路與算法這是經(jīng)典的分治法。我們將算式從一個(gè)操作符的位置分割開,并分別得出左邊和右邊算式所有可能的值。再將左右的值分別按照操作符進(jìn)行計(jì)算。將已經(jīng)遍歷過的結(jié)果存入緩存中,如果碰到重復(fù)的計(jì)算式,就可以直接獲取其所有可能的值。 題目要求 Given a string of numbers and operators, return all possible results from comp...
摘要:當(dāng)右括號(hào)和左括號(hào)的剩余量均為時(shí),及為一個(gè)最終結(jié)果。而則會(huì)在直接原來的對(duì)象上進(jìn)行修改,其指針仍然指向原來的對(duì)象。因此在遞歸的過程中使用一定要注意,對(duì)對(duì)象的修改不要相互干擾。 題目要求 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses....
摘要:復(fù)雜度思路注意的地方,要限制左括號(hào)和右括號(hào)。每出現(xiàn)一次左括號(hào),就相對(duì)于限定了,最多只能出現(xiàn)那么多右括號(hào)。所以,為了完成這種限定,用來控制。不然會(huì)有的情況出現(xiàn)。 LeetCode[22] Generate Parentheses Given n pairs of parentheses, write a function to generate all combinations of ...
摘要:而對(duì)于右括號(hào),必須前面放了一個(gè)左括號(hào),我們才能放一個(gè)右括號(hào)。所以我們根據(jù)剩余可放置左括號(hào),和剩余可放置右括號(hào),代入遞歸,就可以求解。 Generate Parentheses 最新更新請(qǐng)見:https://yanjia.me/zh/2019/01/... Given n pairs of parentheses, write a function to generate all co...
Problem Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: [ ((())), (()()), (())(), ()(()), ...
閱讀 3558·2021-08-31 09:39
閱讀 1866·2019-08-30 13:14
閱讀 2928·2019-08-30 13:02
閱讀 2777·2019-08-29 13:22
閱讀 2353·2019-08-26 13:54
閱讀 777·2019-08-26 13:45
閱讀 1595·2019-08-26 11:00
閱讀 989·2019-08-26 10:58