Java 高效解析一位数算术表达式

Java 高效解析一位数算术表达式,java,algorithm,parsing,Java,Algorithm,Parsing,您将如何高效地(针对运行时进行优化,但同时保持最小空间)解析和计算Java中的一位算术表达式 以下算术表达式均有效: eval("-5")=-5 eval("+4")=4 eval("4")=4 eval("-7+2-3")=-8 eval("5+7")=12 我的方法是迭代所有元素,使用标志跟踪当前的算术运算,并逐位计算 public int eval(String s){ int result = 0; boolean add = true; for(int i

您将如何高效地(针对运行时进行优化,但同时保持最小空间)解析和计算Java中的一位算术表达式

以下算术表达式均有效:

eval("-5")=-5
eval("+4")=4
eval("4")=4
eval("-7+2-3")=-8
eval("5+7")=12
我的方法是迭代所有元素,使用标志跟踪当前的算术运算,并逐位计算

public int eval(String s){
    int result = 0;
    boolean add = true; 
    for(int i = 0; i < s.length(); i++){
        char current = s.charAt(i);
        if(current == '+'){
            add = true;
        } else if(current == '-'){
            add = false;
        } else {
            if(add){
                result +=  Character.getNumericValue(current);
            } else {
                result -= Character.getNumericValue(current);
            }
        }
    }
    return result;
} 
public int eval(字符串s){
int结果=0;
布尔加法=真;
对于(int i=0;i

这是唯一的最佳解决方案吗?我曾尝试使用堆栈跟踪算术运算符,但我不确定这是否更有效。我也没有尝试过正则表达式。我之所以这么问,是因为我在一次采访中给出了上述解决方案,并被告知是次优的

这看起来有点紧凑。它当然需要更少的行和条件。关键是加法是“默认”行为,你遇到的每个减号都会改变你想要添加的符号;只要你记得在每次添加后重置标志

public static int eval(String s){
    int result = 0;
    int sign = 1; 
    for(int i = 0; i < s.length(); i++){
        char current = s.charAt(i);
        switch (current)
        {
            case '+': break;
            case '-': sign *= -1; break;
            default: 
                result += sign * Character.getNumericValue(current);
                sign = 1;
                break;
        }
    }
    return result;
}

您需要查找“递归下降表达式解析器”或Dijkstra调车场算法。当您必须处理运算符优先级或括号时,您当前的方法注定要失败。您还需要忘记正则表达式,转而编写一个合适的扫描器。

您是否有这样的情况:eval(“4+-5”)?@krishnarma是的,考虑到属性(例如eval(“+5”)=5或eval(“-4”)=-4)
new ScriptEngineManager().getEngineByExtension(“js”).eval(“-7+4”)是一种可能性
这只是因为我非常懒。你可以使用向量、数组列表或堆栈类来进一步优化代码,而不是使用字符串。一般来说,我们不怎么处理字符串,因为它们往往会占用更多的资源。@NiteshVerma这就是我难以理解的地方。我正在做的唯一的字符串操作似乎是完全必要的,因为您必须解析字符串中的每个操作和数字。我刚刚尝试了这个方法,我找不到一种方法使函数不能正常工作。首先,我会做一个正则表达式检查,以确保参数不包含空格或任何不同的内容,而不是数字或符号。只有在没有运算符优先级或括号的情况下,这才有效。我已经提到,我只假设了加法和减法,在这种情况下,优先级并不重要;从左到右计算。除了加法和减法之外,没有一个例子包含任何东西。考虑到输入被限制为单个数字,我假设他们不需要涉及正则表达式的解决方案,正则表达式必须被解析,并且通常为输入构建后缀树。这需要一次(相对较快)通过字符串。这显然不是计算一般算术表达式的“正确”方法:不是问题@谁说正则表达式需要后缀树?他们没有。正确编译的正则表达式是一个简单的有限状态自动机,它以O(n)形式解析输入,其中n是输入字符串的长度。不要让你被流行的regexp引擎误导,在最坏的情况下,它的复杂度是指数级的。你可以随意提及,但除非你提到的约束在OP的问题中显得明确,否则这不是一个可接受的答案。你读过问题了吗?在一次采访中,他们被问到,他们大概在哪里需要代码,而代码仅限于一位数的值。我不认为他们在寻找一个功能齐全的解析器。不清楚您是否理解这里的问题带有单个数字的值与此无关。他需要一个表达式解析器,除非有其他约束,没有提到。这是我会给出的答案,如果他们告诉我这是“次优的”,我会走,在编译器中实现了几十次。相反,如果我是面试官,(a)我不会问这样的问题,因为我已经准备好培训一个有合适能力的候选人,但是(b)任何提供答案的人,如果没有一堆类似的答案,都会被拒之门外。不,我绝对理解这里的问题。
System.out.println(eval("1+2+3+4"));
System.out.println(eval("1--3"));
System.out.println(eval("1+-3-2+4+-3"));

10
4
-3