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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

https://leetcode.com/problems/expression-add-operators/description/

題解

中綴表達式求值問題,參考:leetcode 227. Basic Calculator II | 227. 基本計算器 II(中綴表達式求值)

本題主要是兩個回溯,第一個回溯用來切割數字,第二個回溯用來插入運算符。以上兩項工作做完后,用經典的中綴表達式求值,計算是否為 target 即可。

class Solution {int N;List<String> result;HashMap<String, Integer> priorityMap; // 運算符優先級String[] ops;public void initPriorityMap() {priorityMap = new HashMap<>();priorityMap.put("+", 0);priorityMap.put("-", 0);priorityMap.put("*", 1);// priorityMap.put("/", 1);}public List<String> addOperators(String num, int target) {N = num.length();result = new ArrayList<>();ops = new String[]{"+", "-", "*"};initPriorityMap();splitNums(num, 0, target, new LinkedList<>());return result;}public void splitNums(String num, int i, int target, Deque<Integer> queue) { // 回溯1:嘗試所有分割數字方式if (i == N) {genExp(queue, target, new LinkedList<>());}for (int j = i + 1; j <= N; j++) {String sub = num.substring(i, j);if (sub.startsWith("0") && sub.length() > 1 || Long.parseLong(sub) > Integer.MAX_VALUE) continue;queue.add(Integer.valueOf(sub)); // [...)splitNums(num, j, target, queue);queue.removeLast();}}public void genExp(Deque<Integer> queue, int target, Deque<String> exp) { // 回溯2:嘗試所有運算符,生成中綴表達式Deque<Integer> q = new LinkedList<>(queue);if (q.size() == 1) {exp.add(String.valueOf(q.pollFirst())); // System.out.println(exp);Integer res = calExpression(exp, target);if (res == target) {StringBuilder sb = new StringBuilder();for (String s : exp) {sb.append(s);}result.add(sb.toString());}exp.pollLast();return;}exp.add(String.valueOf(q.pollFirst()));for (String op : ops) {exp.add(op);genExp(q, target, exp);exp.pollLast();}exp.pollLast();}public Integer calExpression(Deque<String> exp, int target) { // 中綴表達式求值Stack<Integer> s1 = new Stack<>(); // 操作數棧Stack<String> s2 = new Stack<>(); // 運算符棧boolean isNum = false;Deque<String> q = new LinkedList<>(exp);while (!q.isEmpty()) {isNum = !isNum;String val = q.pollFirst();if (isNum) { // 是數字s1.push(Integer.valueOf(val));} else { // 是運算符if (s2.isEmpty() || isPrior(val, s2.peek())) { // 若當前運算符大于棧頂運算符優先級 則入棧s2.push(val);} else { // 否則 在當前運算符小于等于棧頂運算符情況下 不斷出棧并運算 將運算結果入操作數棧while (s2.size() > 0 && !isPrior(val, s2.peek())) {String op = s2.pop();Integer n1 = s1.pop();Integer n2 = s1.pop();int res = cal(n1, n2, op);s1.push(res);}s2.push(val);}}}while (!s2.isEmpty()) { // 運算符棧中還有剩余 則一直出棧并運算String op = s2.pop();Integer n1 = s1.pop();Integer n2 = s1.pop();int res = cal(n1, n2, op);s1.push(res);}return s1.pop();}public int cal(int n1, int n2, String op) {switch (op) {case "+":return n2 + n1;case "-":return n2 - n1;case "*":return n2 * n1;default:System.out.println("op err");return -1;}}public boolean isPrior(String op1, String op2) {return priorityMap.get(op1) > priorityMap.get(op2);} }

總結

以上是生活随笔為你收集整理的leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)的全部內容,希望文章能夠幫你解決所遇到的問題。

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