题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        Stack<Integer> stack = new Stack<>();
        for ( int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c ==  '(') {
                stack.push(i);
            }
        }
        if (stack.isEmpty()) {
            return computeResult(s);
        }
        StringBuilder builder = new StringBuilder(s);
        while (!stack.isEmpty()) {
            Integer pop = stack.pop();
            int index = pop;
            int indexOf = builder.indexOf(")", index);
            String substring = builder.substring(index + 1, indexOf);
            if (substring.length() > 0) {
                int compute = computeResult(substring);
                builder.replace(index, indexOf + 1, compute + "");
            } else {
                builder.replace(index + 1, indexOf, substring);
            }
        }
        return  computeResult(builder.toString());
    }

    public int computeResult(String s) {
        List<Object> arr = new ArrayList<>();
        compute(s, 0, arr);
        Integer res = null;
        Character reg = null;
        for (Object ite : arr) {
            if (ite instanceof Integer) {
                if (reg == null) {
                    res = (Integer) ite;
                } else {
                    if ('-' == reg) {
                        res = res - (Integer) ite;
                    } else {
                        res = res + (Integer) ite;
                    }
                }
            }
            if (ite instanceof Character) {
                reg = (Character) ite;
            }
        }
        return res;
    }

    public void compute (String s, int index, List<Object> arr) {
        int curri = index;
        StringBuilder numpar = new StringBuilder();
        List<Character> regres = new ArrayList<Character>() {
            {
                add('+');
                add('-');
                add('*');
            }
        };

        while ( curri < s.length() && (!regres.contains(s.charAt(curri))
                                       || ('-' == s.charAt(curri) && (curri == 0))
                                       || regres.contains(s.charAt(curri - 1)) )) {
            numpar.append(s.charAt(curri));
            curri++;
        }
        int i = Integer.parseInt(numpar.toString());
        if (curri >= s.length() - 1) {
            arr.add(i);
            return;
        }
        if ('*' == s.charAt(curri)) {
            while (curri < s.length() && '*' == s.charAt(curri)) {
                numpar = new StringBuilder();
                curri++;
                while ( curri < s.length() && (!regres.contains(s.charAt(curri))
                                               || ('-' == s.charAt(curri) && numpar.length() == 0))) {
                    numpar.append(s.charAt(curri));
                    curri++;
                }
                i =  i * Integer.parseInt(numpar.toString());
            }
            if (curri >= s.length() - 1) {
                arr.add(i);
                return;
            }
            if ('+' == s.charAt(curri)) {
                arr.add(i);
                arr.add('+');
                compute(s, ++curri, arr);
            } else {
                arr.add(i);
                arr.add('-');
                compute(s, ++curri, arr);
            }
        } else {
            if ('+' == s.charAt(curri)) {
                arr.add(i);
                arr.add('+');
                compute(s, ++curri, arr);
            } else {
                arr.add(i);
                arr.add('-');
                compute(s, ++curri, arr);
            }
        }

    }
}

全部评论

相关推荐

黑皮白袜臭脚体育生:简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写会更好另外宣传下自己的开源仿b站微服务项目,GitHub已经410star,牛客上有完整文档教程,如果觉得有帮助的话可以点个小星星,蟹蟹
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务