题解 | #表达式求值#

表达式求值

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;
    }
}

#算法入门#
全部评论

相关推荐

深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务