【发布时间】:2013-09-12 04:45:42
【问题描述】:
您将如何在 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;
}
这是唯一的最佳解决方案吗?我曾尝试使用堆栈来跟踪算术运算符,但我不确定这是否更有效。我也没有尝试过正则表达式。我之所以问,是因为我在一次采访中给出了上述解决方案,并被告知这是次优的。
【问题讨论】:
-
你有没有这样的案例:eval("4+-5")?
-
@KrishnaSarma 是的,考虑到属性(例如 eval("+5")=5 或 eval("-4")=-4)
-
new ScriptEngineManager().getEngineByExtension("js").eval("-7+4")只是因为我非常懒惰。 -
您可以使用向量、数组列表或堆栈类来进一步优化您的代码,而不是使用字符串。一般来说,我们不经常使用字符串,因为它们往往会占用更多资源。
-
@NiteshVerma 这就是我无法理解的。我正在做的唯一字符串操作似乎是完全必要的,因为您必须从字符串中解析每个操作和数字。