日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果

發布時間:2024/4/19 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Different Ways to Add Parentheses

原題鏈接Different Ways to Add Parentheses

給出一個只有加,減,乘運算的表達式,要求在這個表達式中添加合理的括號,返回所有填上括號后的計算結果

考慮每一個操作符(+, -, *),每一個操作符實際上是將表達式分成了左右兩部分。

2?1?1為例,第一個”-“將表達式分成了兩部分,分別是21?1,那么就可以假定添加括號的結果是(2)?(1?1)

同樣的對左右兩邊進行處理

(2)不能再拆分,直接返回

(1?1)中仍然有一個操作符,又分成左右兩部分,分別是11,那么就可以嘉定添加括號的結果是(1)?(1)

繼續對左右兩邊進行處理,都不能繼續拆分,直接返回

可以發現,到最后面,整個表達式都被拆分成一個個數,然后逐層向上返回,根據操作符的不同進行將左右兩邊返回的結果進行不同的運算,繼續向上返回

代碼如下

class Solution { public:vector<int> diffWaysToCompute(string input) {vector<int> res;for(int i = 0; i < input.size(); ++i){//如果是操作符,就將左右兩邊分開if(isOperator(input[i])){//返回左邊和右邊的所有可能結果vector<int> lhs = diffWaysToCompute(input.substr(0, i));vector<int> rhs = diffWaysToCompute(input.substr(i + 1));//依次組合,因為返回之前考慮了為空的情況,所以這里無需判斷是否為空for(auto n1 : lhs){for(auto n2 : rhs){if(input[i] == '+') res.emplace_back(n1 + n2);else if(input[i] == '-') res.emplace_back(n1 - n2);else res.emplace_back(n1 * n2);}}}}if(res.empty()){//可以添加一條語句判斷input是空字符的情況//if(input.empty()) input.append(1, '0');int n = 0;sscanf(input.c_str(), "%d", &n);res.emplace_back(n);}return res;} private:bool isOperator(char op){return op == '+' || op == '-' || op == '*';} };

本題主要還是遞歸,將大問題轉換為左右兩個小問題,進而求解

以前還遇到過只需要將所有加括號的情況返回的,忘記在哪了:cry:

總結

以上是生活随笔為你收集整理的每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。