您的位置:首页 > 编程语言 > Lua

leetcode->Evaluate Reverse Polish Notation

2014-07-23 10:43 507 查看
每天一刷,强迫学习

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are 
+
-
*
/
.
Each operand may be an integer or another expression.

Some examples:

["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6


很容易看出这是一个压栈出栈的问题。思路:

1、输入为字符串,由于有+-*/的存在,栈本身也应该是字符串。由于数组不方便增加删除,因此用ArrayList,动态数组;

2、输入如果为“数字”,则将该“数字”添加到ArrayList中,如果为加减乘除则从ArrayList中取出最后两个字符串并删除,转化为数字后计算值,将值重新压入ArrayList;

3、测试,不通过,提示用例为只有一个数字时返回错误。检查发现return的是计算后的value,当只有一个数字输入时只有压栈没有出栈,因此错误。正确的做法是返回ArrayList中的值。

总结:

1、如果网站没给出测试用例的话,可能debug的要吐血才能发现这个问题。写测试用例考虑边界情况确实是一门学问。

2、用C写比较麻烦,因为没有动态数组,需自己写一个带指针的数组数组,指向当前的栈的位置。可以考虑下如何写。

public class Solution {
public int evalRPN(String[] tokens) {
final String expression ="+-*/";
int value = 0;
int index = -1;
List<String> list = new ArrayList<String>();
for(String s: tokens){
index = expression.indexOf(s);
if(index < 0){
list.add(s);
}else{
switch (index) {
case 0:value = Integer.parseInt(list.get(list.size()-2))
+Integer.parseInt(list.get(list.size()-1));
break;
case 1:value = Integer.parseInt(list.get(list.size()-2))
-Integer.parseInt(list.get(list.size()-1));
break;
case 2:value = Integer.parseInt(list.get(list.size()-2))
*Integer.parseInt(list.get(list.size()-1));
break;
case 3:value = Integer.parseInt(list.get(list.size()-2))
/Integer.parseInt(list.get(list.size()-1));
break;

default:
break;
}
list.remove(list.size()-1);
list.remove(list.size()-1);
list.add(String.valueOf(value));
}
index = -1;
}
return Integer.valueOf(list.get(0));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java leetcode