您的位置:首页 > 其它

[Leetcode] Basic Calculator

2015-08-31 19:56 309 查看
BasicCalculator

Implementabasiccalculatortoevaluateasimpleexpressionstring.

Theexpressionstringmaycontainopen
(
andclosingparentheses
)
,theplus
+
orminussign
-
,non-negativeintegersandemptyspaces
.

Youmayassumethatthegivenexpressionisalwaysvalid.

Someexamples:

"1+1"=2
"2-1+2"=3
"(1+(4+5+2)-3)+(6+8)"=23

Note:Donotusethe
eval
built-inlibraryfunction.

这个问题应该是比较亲切了!但是任然出现了超时问题,原因在于list的使用,list是使用链表实现的,随机存取效率不高,在这里当数据量比较大的时候,效率骤降,改用vector作为存储的基本单位。

代码如下:

importjava.util.*;

publicclassSolution{
//使用list效率应该是更低一些,在这里竟然会超时!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
privateVector<String>getSeg(Strings){
s=s.trim();
Vector<String>segment=newVector<String>();
intpre=0,i=0;
while(i<s.length()){
charc=s.charAt(i);
switch(c){
case'':
i++;
break;
case'(':
case')':
case'+':
case'-':
segment.add(s.substring(i,i+1));
i++;
break;
default:
intendindex=i+1;
while(endindex<s.length()&&Character.isDigit(s.charAt(endindex))){
endindex++;
}
segment.add(s.substring(i,endindex));
i=endindex;
break;
}
}
returnsegment;
}
publicintcalculate(Strings){
Stack<Character>op=newStack<Character>();
Stack<Integer>data=newStack<Integer>();
Vector<String>segments=getSeg(s);
for(inti=0;i<segments.size();i++){
Stringseg=segments.get(i);
intopc=seg.charAt(0);
if(opc<='9'&&opc>='0'){
data.push(Integer.parseInt(seg));
}else{
switch(opc){
case'(':
op.push((char)opc);
break;
case'-':
case'+':
if(!op.isEmpty()&&op.peek()!='('){
intdata1=data.pop();
intdata2=data.pop();
charopthis=op.pop();
intresdata=0;
if(opthis=='+')resdata=data1+data2;
elseresdata=data2-data1;
data.push(resdata);
}
op.push((char)opc);
break;
case')':
while(op.peek()!='('){
intdata1=data.pop();
intdata2=data.pop();
charopthis=op.pop();
intresdata=0;
if(opthis=='+')resdata=data1+data2;
elseresdata=data2-data1;
data.push(resdata);
}
op.pop();
break;
}
}
}
while(!op.isEmpty()){
intdata1=data.pop();
intdata2=data.pop();
charopthis=op.pop();
intresdata=0;
if(opthis=='+')resdata=data1+data2;
elseresdata=data2-data1;
data.push(resdata);
}
returndata.pop();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: