此题真可谓是练习编程语言的绝好材料 !


import java.util.*;class Solution {
class Item {Map<String, Integer> vars = new TreeMap<>();int k = 1;String tos() {StringBuilder builder = new StringBuilder();List<String> a = new ArrayList<>();for (String i : vars.keySet()) {for (int j = 0; j < vars.get(i); j++) {a.add(i);}}if (a.size() == 0) return "";builder.append(a.get(0));for (int i = 1; i < a.size(); i++) {builder.append("*" + a.get(i));}return builder.toString();}Item copy() {Item it = new Item();it.k = k;for (Map.Entry<String, Integer> i : vars.entrySet()) {it.vars.put(i.getKey(), i.getValue());}return it;}Item mul(Item another) {Item ans = new Item();ans.k = k * another.k;for (Map.Entry<String, Integer> i : vars.entrySet()) {ans.vars.put(i.getKey(), i.getValue());}for (Map.Entry<String, Integer> i : another.vars.entrySet()) {if (ans.vars.containsKey(i.getKey())) {ans.vars.put(i.getKey(), ans.vars.get(i.getKey()) + i.getValue());} else {ans.vars.put(i.getKey(), i.getValue());}}return ans;}int getMi() {int s = 0;for (int x : vars.values()) {s += x;}return s;}Item render(Map<String, Integer> eval) {Item j = new Item();j.k = k;for (Map.Entry<String, Integer> i : vars.entrySet()) {if (eval.containsKey(i.getKey())) {j.k *= Math.pow(eval.get(i.getKey()), i.getValue());} else {j.vars.put(i.getKey(), i.getValue());}}return j;}
}class Exp {List<Item> items = new ArrayList<>();Exp add(Exp another) {Exp exp = new Exp();Map<String, Item> ma = new TreeMap<>();for (Item i : another.items) {Item j = i.copy();exp.items.add(j);ma.put(j.tos(), j);}for (Item i : items) {String k = i.tos();if (ma.containsKey(k)) {ma.get(k).k += i.k;} else {Item j = i.copy();ma.put(k, j);exp.items.add(j);}}return exp;}Exp sub(Exp another) {another.mul(-1);Exp ans = add(another);another.mul(-1);ans.mul(-1);return ans;}void mul(int x) {for (Item i : items) {i.k *= x;}}Exp mul(Exp another) {Exp ans = new Exp();for (Item i : items) {for (Item j : another.items) {ans.items.add(i.mul(j));}}return ans;}@Overridepublic String toString() {List<String> a = tos(this);StringBuilder builder = new StringBuilder();for (String i : a) {builder.append("+" + i);}return builder.toString();}
}List<String> tokenize(String expression) {List<String> ans = new ArrayList<>();for (int i = 0; i < expression.length(); i++) {if ("()+-*".indexOf(expression.charAt(i)) != -1) {ans.add(expression.charAt(i) + "");} else if (Character.isDigit(expression.charAt(i))) {int j = i;while (j < expression.length() && Character.isDigit(expression.charAt(j))) {j++;}ans.add(expression.substring(i, j));i = j - 1;} else if (Character.isLetter(expression.charAt(i))) {int j = i;while (j < expression.length() && Character.isLetter(expression.charAt(j))) {j++;}ans.add(expression.substring(i, j));i = j - 1;}}return ans;
}int getPriority(String i) {if (i.equals("*")) return 1;if (i.equals("+") || i.equals("-")) return 0;if (i.equals("(")) return 2;if (i.equals(")")) return -1;throw new RuntimeException("无法操作符号" + i);
}boolean isNumber(String s) {for (int i = 0; i < s.length(); i++) {if (!Character.isDigit(s.charAt(i))) {return false;}}return true;
}Exp number2Exp(int x) {Exp exp = new Exp();Item it = new Item();it.k = x;exp.items.add(it);return exp;
}Exp var2Exp(String var) {Exp exp = new Exp();Item it = new Item();it.vars.put(var, 1);exp.items.add(it);return exp;
}Exp calculate(Exp m, Exp n, String op) {if (op.equals("*")) return m.mul(n);else if (op.equals("+")) return m.add(n);else if (op.equals("-")) return m.sub(n);throw new RuntimeException("无法处理" + op + "运算");
}Exp parse(List<String> token) {Stack<Exp> num = new Stack<>();Stack<String> op = new Stack<>();for (String i : token) {if (i.equals(")")) {while (!op.peek().equals("(")) {num.push(calculate(num.pop(), num.pop(), op.pop()));}op.pop();} else if ("+-*(".indexOf(i.charAt(0)) != -1) {while (!op.empty() && !op.peek().equals("(") && getPriority(i) <= getPriority(op.peek())) {Exp a = num.pop(), b = num.pop();String o = op.pop();num.push(calculate(a, b, o));}op.push(i);} else if (isNumber(i)) {num.push(number2Exp(Integer.parseInt(i)));} else {num.push(var2Exp(i));}}while (!op.empty()) {num.push(calculate(num.pop(), num.pop(), op.pop()));}return num.pop();
}Exp render(Exp exp, Map<String, Integer> eval) {Exp ans = new Exp();for (Item i : exp.items) {Item j = i.render(eval);ans.items.add(j);}return ans;
}Exp sort(Exp exp) {//合并同类项Map<String, Item> vars = new TreeMap<>();for (Item i : exp.items) {if (vars.containsKey(i.tos())) {vars.get(i.tos()).k += i.k;} else {vars.put(i.tos(), i);}}//去掉0项exp.items = new ArrayList<>();for (Item i : vars.values()) {if (i.k == 0) continue;exp.items.add(i);}//排序exp.items.sort((o1, o2) -> {int mi1 = o1.getMi();int mi2 = o2.getMi();if (mi1 == mi2) {return o1.tos().compareTo(o2.tos());} else {return mi2 - mi1;}});return exp;
}List<String> tos(Exp exp) {List<String> ans = new ArrayList<>();for (Item i : exp.items) {String it = i.k + "";if (i.tos().length() > 0) {it += "*" + i.tos();}ans.add(it);}return ans;
}public List<String> basicCalculatorIV(String expression, String[] evalvars, int[] evalints) {List<String> token = tokenize(expression);Map<String, Integer> eval = new TreeMap<>();for (int i = 0; i < evalvars.length; i++) {eval.put(evalvars[i], evalints[i]);}Exp exp = parse(token);exp = render(exp, eval);exp = sort(exp);List<String> ans = tos(exp);return ans;
}void haha() {List<String> ans = basicCalculatorIV("a*b+a*b*c*d", new String[]{"b"}, new int[]{2});for (String i : ans) {System.out.print(i + " ");}
}public static void main(String[] args) {Solution s = new Solution();s.haha();
}
}

转载于:https://www.cnblogs.com/weiyinfu/p/8505541.html

leetcode770. Basic Calculator IV相关推荐

  1. LeetCode Basic Calculator II(加减乘除计算器)

    与 LeetCode Basic Calculator(用栈计算表达式的值)相似 代码如下: public class Solution {private int cal(int num1, int ...

  2. LeetCode OJ Basic Calculator II

    Basic Calculator II 题目 思路 和这个一样:Basic Calculator I 代码 class ExpressionTransformation { public:string ...

  3. [LeetCode]Basic Calculator

    题目:Basic Calculator 给定一个合法的运算表达式,该表达式中只包含数字.'+'.'-'.' '.'('.')'. 思路: 简单思考不用看成加减两种运算,直接看成加法,只不过由正负: 如 ...

  4. Basic Calculator II

    该题和前面的" Basic Calculator "的处理方法一样,仅仅是增加了对"*"."/"两种运算的支持. class Solutio ...

  5. Basic Calculator 基本计算器-Leetcode

    1.题目: Implement a basic calculator to evaluate a simple expression string. The expression string may ...

  6. 数据结构与算法 | LeetCode 224. Basic Calculator

    原文链接:https://wangwei.one/posts/alg... 前面,我们学习了 栈的实现及其应用 ,今天我们基于栈,来实现一个简单的计算器功能. 简单计算器实现 Leetcode 224 ...

  7. [Swift]LeetCode227. 基本计算器 II | Basic Calculator II

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  8. [Leetcode] 772. Basic Calculator III 解题报告

    题目: Implement a basic calculator to evaluate a simple expression string. The expression string may c ...

  9. 227 Basic Calculator II

    1 题目 Implement a basic calculator to evaluate a simple expression string.The expression string conta ...

最新文章

  1. 开源监控系统 Prometheus 入门
  2. MongoDB学习笔记——Master/Slave主从复制
  3. Ubuntu20.04中安装shutter
  4. STM32F103构建固件库模板(PS固件库文件树介绍)
  5. 一致性哈希算法 应用
  6. SpringCloud Sleuth分布式请求链路追踪
  7. 程序员常见保健方法【转贴】
  8. java画笔覆盖在界面_Java画笔的简单实用方法
  9. CentOS 安装MySQL5.7 源码方式安装
  10. 栈的应用--中缀表达式转后缀表达式
  11. Drupal 更新开源编辑器 CKEditor,修复两个 XSS 漏洞
  12. 20172315 2017-2018-2 《程序设计与数据结构》实验三报告
  13. (转载)C#中如何获取当前路径的几种方法
  14. 拓端tecdat|R语言时间序列数据指数平滑法分析交互式动态可视化
  15. react native环境搭建的一些坑
  16. cad立面索引符号 规范_园林景观设计规范——园林人都该知道!
  17. 【备忘】Aegisub字幕制作简易方法
  18. matlab视频行人检测,利用MATLAB实现了视频图像行人识别与检测
  19. 计算机安装win10系统还原,解决win10电脑一键还原教程
  20. vivos9桌面字体样式怎样修改

热门文章

  1. express+mysqle
  2. C语言实现栈的进栈与出栈、输出栈顶元素、元素个数、销毁栈
  3. mkdir 创建目录
  4. 提供《疯狂的程序员》下载地址
  5. Sql Server 行转列学习 根据学生表、课程表、学生成绩表统计每个学生的各科成绩和他的总成绩、平均成绩...
  6. 【实习之T100开发】T100 基础架构、命名原则
  7. 【C++快速入门】基础语法篇
  8. 【jQuery笔记Part1】12-jQuery元素的角标
  9. Linux搭建smb共享ftp服务器——windows无法写入samba共享路径 无操作权限的问题解决
  10. python进阶22再识单例模式