题解 | #表达式求值#
表达式求值
https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ public int solve (String s) { String str = s.replaceAll(" ", ""); char[] cs = str.toCharArray(); int n = str.length(); boolean isFu = false; // 第一步,处理() 这里有一个负数的处理 如果前面遇到的是 * , while (s.contains("(")) { // 1、找 Last ( int i = s.lastIndexOf("("); int j; for (j = i; j < n; j++) { if (cs[j] == ')') { break; } } // 说明 i, j是一对() 把中间的内容计算出来并做一个替换。 final int solveValue = solve(s.substring(i + 1, j)); s = s.replace(s.substring(i, j + 1), String.valueOf(solveValue)); str = s.replaceAll(" ", ""); cs = str.toCharArray(); n = str.length(); } // 第二步,说明所有的 括号都已经改成了数字。准备处理所有乘法。 while (s.contains("*")) { int i = s.indexOf("*"); int j = i + 1; // 使用中心扩散 if (cs[j] == '-') { isFu = true; j++; } int k = i - 1, f = j; while (k >= 0 && Character.isDigit(cs[k])) { k--; } while (f < s.length() && Character.isDigit(cs[f])) { f++; } // 两个数字的值分别是: int a = Integer.parseInt(s.substring(k + 1, i)); int b = Integer.parseInt(s.substring(j, f)); if (isFu) { s = s.replace(s.substring(k + 1, f), String.valueOf(-a * b)); } else { s = s.replace(s.substring(k + 1, f), String.valueOf(a * b)); } str = s.replaceAll(" ", ""); cs = str.toCharArray(); n = str.length(); } str = s.replaceAll("\\+-", "-").replaceAll("--", "+"); cs = str.toCharArray(); n = str.length(); // 最后就只剩下 + - 法,直接使用 遍历,获取到每一个字符,进行计算。 // 如果是遇到数字,则拼接到临时的数字里,如果遇到的是字符,则停止拼接,并转成数字,准备计算。 int ans = 0; Character ops = '+'; // 当前操作符 String numCurr = "0"; for (int i = 0; i < n; i++) { if (Character.isDigit(cs[i])) { numCurr += cs[i]; } else {//说明遇到的是字符了。应该使用 ans加上 操作符,重新计算ans,并重新记录操作符 if (ops == '+') { ans += Integer.parseInt(numCurr); } else if (ops == '-') { ans -= Integer.parseInt(numCurr); } ops = cs[i]; numCurr = ""; } } if (ops == '+') { ans += Integer.parseInt(numCurr); } else if (ops == '-') { ans -= Integer.parseInt(numCurr); } return ans; } }#算法入门#