241 為運算表示式設計優先順序(分治)

2021-10-10 23:47:07 字數 1586 閱讀 2014

給定乙個含有數字和運算子的字串,為表示式新增括號,改變其運算優先順序以求出不同的結果。你需要給出所有可能的組合的結果。有效的運算符號包含 +, - 以及 * 。

看到題就覺得有點複雜,可以考慮一下遞迴的方式,去尋找子問題和原問題解的關係。

可以通過運算子把整個式子分成兩部分,兩部分再利用遞迴解決。

以 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...