题解 | #表达式求值#

表达式求值

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

}

全部评论

相关推荐

头像
03-18 09:09
Java
点赞 评论 收藏
转发
2 收藏 评论
分享
牛客网
牛客企业服务