news 2026/4/8 10:33:32

leetcode 困难题 770. Basic Calculator IV 基本计算器 IV

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 困难题 770. Basic Calculator IV 基本计算器 IV

Problem: 770. Basic Calculator IV 基本计算器 IV

解题过程

困难题,步骤太多了,多项式加法和乘法,写了300多行的codes,平时就几十行,首先放入列表中,将字符串、运算符号全部放入列表中,当字符是(时,入栈找到)然后递归调用,拿到列表以后,将-号全部放入到数字或者字符串内,就开始运算,实现了多项式加法和乘法,每次算完就替换掉,并且删除两个,继续运算的,

加法数字单独考虑,两个多项式,若都是数字直接累加,若都是变量则提取出系数和字符串,系数累加的,若是没找到匹配的,就是累加到数字或者放入结果列表中,若是数字!=0则放入列表

乘法数字单独考虑,若都是变量则提取出系数和字符串,系数累加的,字符串根据字典序排列并用*号拼接起来,若一个变量一个数字则系数累乘的而且字符串不变,还需要考虑结果列表中有相同字符串的结果,此时需要合并起来也就是系数累加起来,若是没找到匹配的,就是累加到数字或者放入结果列表中,若是数字!=0则放入列表

还需要考虑结果是0的情况,此时也放入列表中当作占位符,最后删掉即可

排序的时候统计*号的个数,*号越多越靠前,否则按照字典序排序,数字排在最后

Code

class Solution { public: unordered_map<string, int> ump; int findparentheses(string& expression, int start) { stack<char> tk; tk.push('('); for(int i = start; i < expression.size(); i++) { if(expression[i]=='(') tk.push('('); else if(expression[i]==')') tk.pop(); if(tk.empty()) { return i; } } return 0; } vector<string> dfs(string& expression) { string tmp; vector<vector<string>> tk; for(int i = 0; i < expression.size(); i++) { if(isalpha(expression[i])||isdigit(expression[i])|| expression[i]=='-'||expression[i]=='+'||expression[i]=='*') { tmp += expression[i]; } if(expression[i]==' ' || i == expression.size()-1) { if(ump.find(tmp) != ump.end()) { tk.push_back( { to_string( ump[tmp] ) } ); } else { tk.push_back({tmp}); } int n = tk.size(); if(tk[n-1][0]!="+" && tk[n-1][0]!="-" && tk[n-1][0]!="*" && !isNum(tk[n-1][0])) { tk[n-1][0] = {"1*" + tk[n-1][0]}; } tmp.clear(); }else if(expression[i]=='(') { int j = findparentheses(expression, i+1); string tmptg = expression.substr(i+1, j - i - 1); vector<string> trtg = dfs(tmptg); if(trtg.size() > 0) { tk.push_back(trtg); } else { tk.push_back({"0"}); } i = j + 1; } } for(int j = 0; j < tk.size()-1; j++) { if(j >= (int)tk.size()-1) { break; } if(tk[j][0].size()==1 && tk[j][0]=="-") { tk[j][0] = {"+"}; for(int k = 0; k < tk[j+1].size(); k++) { if(isNum(tk[j+1][k])) { if(tk[j+1][k][0]!='-') { tk[j+1][k] = "-" + tk[j+1][k]; } else { tk[j+1][k] = tk[j+1][k].substr(1); } } else { int id = tk[j+1][k].find('*'); string tri = tk[j+1][k].substr(id+1); if(tk[j+1][k][0]!='-') { tk[j+1][k] = "-" + tk[j+1][k]; } else { tk[j+1][k] = tk[j+1][k].substr(1); } } } } } if(tk.size() > 0 && tk.front()[0] == "+") { tk.erase(tk.begin()); } for(int i = tk.size()-2; i >= 0; i--) { //// "(av * 9) - (ar + 0) - ((bq - cv) + v * (b + bq - bk)) * (a - 12 + 2 - (6 * cc - 8 - bv + ag))" if(i - 2 >= 0 && tk[i-2].size()==1 && tk[i-2][0]=="*") { vector<string> tgt = multiply(tk[i-3], tk[i-1]); // tk[i-1] = tgt; if(tgt.size() > 0) { tk[i-1] = tgt; } else { tk[i-1] = {"0"}; } tk.erase(tk.begin() + i - 3); tk.erase(tk.begin() + i - 3); i--; }else if(tk[i].size()==1 && (tk[i][0]=="+" || tk[i][0]=="-" || tk[i][0]=="*")) { vector<string> tgt; if(tk[i][0]=="+"){ tgt = add_sub(tk[i-1], tk[i+1], 1); } else if(tk[i][0]=="*"){ tgt = multiply(tk[i-1], tk[i+1]); } if(tgt.size() > 0) { tk[i+1] = tgt; } else { // tk.erase(tk.begin() + i + 1); tk[i+1] = {"0"}; } tk.erase(tk.begin() + i - 1); tk.erase(tk.begin() + i - 1); i--; } if(tk.size() == 1) break; } if(tk.size()==0) return {}; if(tk[0][0]=="0") return {}; return tk[0]; } bool isNum(string t) { for(char& c : t) { if(c>='a' && c<='z') { return false; } } return true; } vector<string> add_sub(vector<string>&a, vector<string>&c, int type) { vector<string> ret; unordered_set<int> te; int number = 0; for(int i = 0; i < a.size(); i++) { int find = -100; for(int j = 0; j < c.size(); j++) { if(te.find(j)!=te.end()) continue; if(isNum(a[i]) && isNum(c[j])) { te.insert(j); find = 1; int n1 = stoi(a[i]); int n2 = stoi(c[j]); if(type < 0) { number = number + n1 - n2; } else { number = number + n1 + n2; } } else { int id1, id2; string t1, t2, p1, p2; id1 = a[i].find('*'); id2 = c[j].find('*'); if(id1!=string::npos && id2!=string::npos) { t1 = a[i].substr(id1); t2 = c[j].substr(id2); p1 = a[i].substr(0, id1); p2 = c[j].substr(0, id2); if(t1==t2) { int nt; if(type < 0) { nt = stoi(p1) - stoi(p2); } else { nt = stoi(p1) + stoi(p2); } a[i] = to_string(nt) + t1; find = 0; te.insert(j); } } } } if(find < 0) { if(isNum(a[i])) number += stoi(a[i]); else ret.push_back(a[i]); } else if(find==0) { int id1 = a[i].find('*'); if(id1!=string::npos) { string t1 = a[i].substr(0, id1); if(stoi(t1)!=0) { ret.push_back(a[i]); } } } } for(int j = 0; j < c.size(); j++) { if(te.find(j)!=te.end()) continue; ret.push_back(c[j]); } if(number!=0) { ret.push_back(to_string(number)); } return ret; } vector<string> multiply(vector<string>&a, vector<string>&c) { vector<string> ret; int number = 0; for(int i = 0; i < a.size(); i++) { for(int j = 0; j < c.size(); j++) { if(isNum(a[i]) && isNum(c[j])) { int n1 = stoi(a[i]); int n2 = stoi(c[j]); number = number + n1 * n2; } else { int id1, id2; string t1, t2, p1, p2; id1 = a[i].find('*'); id2 = c[j].find('*'); if(id1!=string::npos && id2!=string::npos) { t1 = a[i].substr(id1); t2 = c[j].substr(id2); p1 = a[i].substr(0, id1); p2 = c[j].substr(0, id2); vector<string> testr; string tmptmp; for(int k = 0; k < t1.size(); k++) { if(t1[k]!='*') { tmptmp += t1[k]; } if((t1[k]=='*'||k==t1.size()-1) && tmptmp.size()!=0) { testr.push_back(tmptmp); tmptmp.clear(); } } tmptmp.clear(); for(int k = 0; k < t2.size(); k++) { if(t2[k]!='*') { tmptmp += t2[k]; } if((t2[k]=='*'||k==t2.size()-1) && tmptmp.size()!=0) { testr.push_back(tmptmp); tmptmp.clear(); } } tmptmp.clear(); sort(testr.begin(), testr.end()); for(auto& tg : testr) { tmptmp = tmptmp + "*" + tg; } int nt; nt = stoi(p1) * stoi(p2); for(int k = 0; k < ret.size(); k++) { id2 = ret[k].find('*'); if(id2 != string::npos) { p2 = ret[k].substr(0, id2); t2 = ret[k].substr(id2); if(t2 == tmptmp) { nt = nt + stoi(p2); ret.erase(ret.begin() + k); break; } } } if(nt!=0) ret.push_back(to_string(nt) + tmptmp); } else { if(id1!=string::npos && id2==string::npos) { t1 = a[i].substr(id1); t2 = ""; p1 = a[i].substr(0, id1); p2 = c[j]; } else { t1 = ""; t2 = c[j].substr(id2); p1 = a[i]; p2 = c[j].substr(0, id2); } string tmptmp = t1 + t2; int nt; nt = stoi(p1) * stoi(p2); for(int k = 0; k < ret.size(); k++) { id2 = ret[k].find('*'); if(id2 != string::npos) { p2 = ret[k].substr(0, id2); t2 = ret[k].substr(id2); if(t2 == tmptmp) { nt = nt + stoi(p2); ret.erase(ret.begin() + k); break; } } } if(nt!=0) ret.push_back(to_string(nt) + tmptmp); } } } } if(number!=0) { ret.push_back(to_string(number)); } return ret; } static bool compare(string&as, string& cs) { int id1, id2, n1 = 0, n2 = 0; string tt1, tt2; id1 = as.find('*'); id2 = cs.find('*'); if(id1!=string::npos && id2!=string::npos) { for(int i = id1; i < as.size(); i++) { if(as[i]=='*') n1++; // else tt1 += as[i]; } for(int i = id2; i < cs.size(); i++) { if(cs[i]=='*') n2++; // else tt2 += cs[i]; } tt1 = as.substr(id1+1); tt2 = cs.substr(id2+1); if(n1==n2) return tt1 < tt2; else return n1 > n2; } else if(id1==string::npos) { return false; } else { return true; } } vector<string> basicCalculatorIV(string expression, vector<string>& evalvars, vector<int>& evalints) { for(int i = 0; i < evalvars.size(); i++) { ump[evalvars[i]] = evalints[i]; } vector<string> ret = dfs(expression); for(int i = 0; i < ret.size(); i++) { if(ret[i]=="0") { ret.erase(ret.begin() + i); i--; } } if(ret.size()==0) return {}; sort(ret.begin(), ret.end(), compare); return ret; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 1:40:18

Aspera传输相比FTP有哪些显著优势?

在日常工作和跨国协作中&#xff0c;大规模数据传输是许多企业与团队面临的关键挑战。传统的FTP&#xff08;文件传输协议&#xff09;长期以来被广泛使用&#xff0c;但随着数据量的爆发式增长及对传输效率要求的提升&#xff0c;其局限性日益凸显。IBM Aspera作为高速传输技术…

作者头像 李华
网站建设 2026/4/7 12:23:02

学校想做云桌面的话需要注意什么?

在数字化转型的浪潮中&#xff0c;云桌面凭借灵活访问、集中管理、数据安全等优势&#xff0c;正成为政府、医疗、金融、能源等行业信息化建设的重要方向。然而&#xff0c;构建云桌面体系并非简单的设备上云&#xff0c;其中涉及架构设计、技术选型、安全合规、运维管理等多重…

作者头像 李华
网站建设 2026/4/5 10:22:39

数字孪生技术驱动现代水利智能创新建设

2023年&#xff0c;广东北江流域通过数字孪生平台精准预演洪峰轨迹&#xff0c;提前72小时启动分洪预案&#xff0c;避免经济损失超10亿元&#xff1b;2024年&#xff0c;某水利利用数字孪生引擎模拟村落淹没场景&#xff0c;为人员转移提供分钟级决策支持……这些案例背后&…

作者头像 李华
网站建设 2026/4/4 7:03:34

特征值类重大升级

这个 特征值主信息类 std::variant 载体方案&#xff0c;在保持原有架构优势的同时&#xff0c;成功实现了值语义、内嵌存储、高性能访问、易序列化&#xff0c;而且完全兼容全局唯一、去重、共享、融合、索引等核心能力。 是一次成功的架构升级。 为什么这次彻底没问题了&…

作者头像 李华
网站建设 2026/4/7 21:54:58

【MyBatis】MyBatis操作动态sql MyBatisGenerator

文章目录mybatis进阶&#xff08;动态sql&#xff09;一、<if>标签二、<trim>标签三、<where>标签四、<set>标签五、<foreach>标签六、<include>标签MyBatisGenerator1. 引入插件2. 添加 generatorConfig.xml 并修改3. 生成文件mybatis进阶…

作者头像 李华