給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。
看到題就覺得有點複雜,可以考慮一下遞迴的方式,去尋找子問題和原問題解的關係。
可以通過運算子把整個式子分成兩部分,兩部分再利用遞迴解決。
以 2 * 3 - 4 * 5 為例。
2 和 3 - 4 * 5 兩部分,中間是 * 號相連。
2 * 3 和 4 * 5 兩部分,中間是 - 號相連。
2 * 3 - 4 和 5 兩部分,中間是 * 號相連。
有了兩部分的結果,然後再通過中間的符號兩兩計算加入到最終的結果中即可。
比如第一種情況,2 和 3 - 4 * 5 兩部分,中間是 * 號相連。
2 的解就是 [2],3 - 4 * 5 的解就是 [-5, -17]。
把兩部分解通過 * 號計算,最終結果就是 [-10, -34]。
另外兩種情況也類似。
然後還需要遞迴出口。
如果給定的字串只有數字,沒有運算子,那結果就是給定的字串轉為數字。
比如上邊的第一種情況,2 的解就是 [2]。
給**的最後臨時加一行**來見證result的歷程
以input="2-1-1"
為例: 可以看出,最後一次求出的result才是我們想要的結果
class
solution}}
}}/* ①分治到最小了,無法在分了,因為分到最小,input.substring(0, i)是只有乙個數字了,然後再進入diffwaystocompute()
會發現if迴圈只會執行一次,而且因為input裡面只含有乙個值,並且是個數字,不是符號,所以不會對result陣列產生影響,
即在該次遞迴中result的size為0.
②應對純數字的情況,比如第一次輸入的就是乙個"12"。
*/if(result.
size()
==0) collections.
sort
(result)
;//讓result從小到大排序
return result;
/* 在每次分治的呼叫diffwaystocompute()時,都會返回乙個result,即為分到最小的那個值,但並不是最終的結果,
最終的結果是在分治的「分」到最小了,不能再分了,然後再合併起來的結果。即最後一次呼叫diffwaystocompute()的result才是我們要的result,
而分治過程中的result並不是我們想要的。
*/}}
241 為運算表示式設計優先順序
思路 分治法 不同位置新增括號的作用在於改變不同運算子的優先順序。所以,可以在遍歷的過程中依次把運算子設為第一優先順序,遞迴計算左邊和右邊。class solution def diffwaystocompute self,input str list int if input isdigit 全數...
241 為運算表示式設計優先順序
給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 以及 示例 1 輸入 2 1 1 輸出 0,2 解釋 2 1 1 0 2 1 1 2 示例 2 輸入 23 45 輸出 34,14,10,10,10 解釋 2 3...
241 為運算表示式設計優先順序
題目描述 給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 以及 解題思路一 對於每乙個運算符號,先執行兩邊的表示式,然後再處理當前這個符號,採用分治的思想,如下 class solution def diffw...