题解 | #表达式求值#

表达式求值

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

感觉再题目中真的算是难的了:我的解决思路就是:
1、先递归分割出由()包裹的子字符串,对子字符串同样的处理方式,直至消除()
2、没有()后,先进行计算所有累计 *
3、最后按顺序 + -即可,我只是完成了,还可以优化,懒得搞了。。
代码如下:
import java.util.*;

public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 返回表达式的值
* @param s string字符串 待计算的表达式
* @return int整型
*/
public int solve (String s) {
return computeValue(s);
}

public int computeValue(String s){
    char[] chars = s.toCharArray();
    ArrayList<String> list = new ArrayList<>();
    int i = 0;
    while (i < chars.length){
        switch(chars[i]){
            case '(':
                Stack<Character> brackets = new Stack<>();
                brackets.push(chars[i]);
                int begin = i;
                while (!brackets.isEmpty()){
                    i++;
                    switch(chars[i]){
                        case '(':
                            brackets.push(chars[i]);
                            break;
                        case ')':
                            brackets.pop();
                            break;
                    }
                }
                list.add(String.valueOf(computeValue(s.substring(begin+1,i))));
                break;
            case '+':
                list.add("+");
                break;
            case '-':
                list.add("-");
                break;
            case '*':
                list.add("*");
                break;
            default:
                String num ="";
                while ( i < chars.length && isNumber(chars[i])){
                    num+=chars[i];
                    i++;
                }
                list.add(num);
                continue;
        }
        i++;
    }
    ArrayList<String> objects = new ArrayList<>();
    for(int j = 0; j < list.size();j++){
        int result = 0;
        if(j < list.size()-1 && list.get(j+1).equals("*")){
            result=Integer.parseInt(list.get(j));
            while (j < list.size()-1 && list.get(j+1).equals("*")){
                j++;
                result*=Integer.parseInt(list.get(++j));
            }
            objects.add(String.valueOf(result));
        }else {
            objects.add(list.get(j));
        }
    }
    int result = Integer.parseInt(objects.get(0));
    for(int j = 1;j < objects.size();j++){
        String s1 = objects.get(j);
        switch(s1){
            case "+":
                result+=Integer.parseInt(objects.get(j+1));
                break;
            case "-":
                result-=Integer.parseInt(objects.get(j+1));
                break;
        }
    }
    return result;
}
public boolean isNumber(char i){
    switch(i){
        case '+':
        case '-':
        case '*':
        case '(':
        case ')':
            return false;
    }
    return true;
}

}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:05
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:24
大家还是用ai改吧,我心疼得要死,就当花钱买教训吧,人家直接拿完钱就跑路了
程序员小白条:简历修改700....神奇,又不是帮你面试,咋的,简历修改从双非变92了还是没实习变成有大厂实习了
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务