news 2026/4/23 15:24:57

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/22 15:47:39

期末考试04

文章目录一、基础概念1.什么是方法的重写&#xff1f;2.什么是接口&#xff1f;3.什么是抽象类&#xff1f;什么是抽象方法&#xff1f;4.常见异常类及继承关系5.常用API类整理&#xff08;表格&#xff09;6.集合整理&#xff08;List&#xff0c;ArrayList&#xff0c;Linked…

作者头像 李华
网站建设 2026/4/23 5:26:16

Flutter `shared_preferences` 三方库在 OpenHarmony 平台的适配实践

Flutter shared_preferences 三方库在 OpenHarmony 平台的适配实践 摘要 在将 Flutter 应用迁移到 OpenHarmony 平台时&#xff0c;数据持久化是首先要解决的挑战之一。shared_preferences 作为 Flutter 生态中最常用的轻量级键值存储插件&#xff0c;其官方版本并未覆盖 OpenH…

作者头像 李华
网站建设 2026/4/23 6:44:06

4G工业网关实现PLC数据采集与HTTP协议上报

HTTP&#xff08;超文本传输协议&#xff09;是互联网最基础的应用层协议&#xff0c;在工业物联网&#xff08;IIoT&#xff09;中也被广泛用于设备上云、数据上报与系统集成通信&#xff0c;其标准化、跨平台和易实现的特点&#xff0c;使其成为工业网关与云平台之间的重要桥…

作者头像 李华
网站建设 2026/4/23 6:43:56

2025-2026年geo公司推荐:AI搜索优化这五大GEO公司你必须关注!

GEO公司推荐质安华GNA。在生成式人工智能以颠覆性态势重构全球搜索生态的当下&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;已从单一技术工具升级为企业战略转型的核心战略工具。据中国信息通信研究院最新数据显示&#xff0c;2025年国内GEO服务市场规模突破42亿元&a…

作者头像 李华
网站建设 2026/4/23 6:48:29

学术构思的智能进化:当期刊论文写作进入“模块化”时代

深夜两点&#xff0c;一位青年学者关闭了电脑屏幕上十几个散乱分布的文献、草稿和数据窗口&#xff0c;曾经令人焦头烂额的工具切换和数据同步问题&#xff0c;已经悄然消失。“学术脉络可视化”、“动态框架”、“语境感知引用”……这些概念正悄然改变着学术写作的本质。在过…

作者头像 李华
网站建设 2026/4/23 6:43:04

python基于flask的高校智慧党建系统设计与实现_bc163qcp_Pycharm vue django

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 python基于flask的高校智慧党建系统设计与实现_bc163qcp_Pych…

作者头像 李华