赞
踩
https://leetcode-cn.com/problems/basic-calculator/
思路:好无聊的题目啊……注意细节就行了,可以直接上递归。
class Solution { public: using pr=pair<int,int>; pr dfs(const string &s,int idx) { int n=s.size(),sum=0,tmp=0,sign=1; while(idx<n) { if(s[idx]=='(') { pr p=dfs(s,idx+1); sum+=sign*p.first; idx=p.second; tmp=0,sign=1; } else if(s[idx]==')') break; else if(s[idx]==' ') ; else if(s[idx]>='0'&&s[idx]<='9') tmp=tmp*10+(s[idx]-'0'); else { sum+=sign*tmp; tmp=0; sign=s[idx]=='+'?1:-1; } ++idx; } sum+=sign*tmp; return pr(sum,idx); } int calculate(string s) { return dfs(s,0).first; } };
或者用栈,这个思路是存储当前的符号:正号就是1,负号就是-1,准确来说它维护的是括号之前符号,这样在括号内可以直接计算出最终的正确符号(相当于把括号去掉,并展开)。
class Solution { public: int calculate(string s) { stack<int> signs; int ans=0,sign=1,n=s.size(),tmp=0,i=0; signs.push(1); while(i<n) { if(s[i]==' ') ; else if(s[i]=='(') signs.push(sign); else if(s[i]==')') signs.pop(); else if(s[i]=='+') sign=signs.top(); else if(s[i]=='-') sign=-signs.top(); else { tmp=0; while(i<n&&s[i]>='0'&&s[i]<='9') tmp=tmp*10+(s[i]-'0'),++i; ans+=sign*tmp; --i; } ++i; } return ans; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。