题目描述
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。
示例 1:
输入: “(1+(4+5+2)-3)+(6+8)”
输出: 23
总结
高手思维,是把困难的问题想透,还是能够把困难的问题简单化
这道题看着蛮简单的,其实也不复杂
SC思维一角:递归,把问题拆分成(X+Y-Z)的形式,把所有的括号里的递归计算,简化括号再算结果 ,包括最外层。
SDC对栈的运用我是认了,我是垃圾
EC主要是char和超过65535?的数字会出错
Sample Code
class Solution {
public int calculate(String s) {
s = "(" + s + ")";
int[] cur = {1};
return (int)inner(s, cur);
}
public long inner(String s, int[] cur) {
long sol = 0;
boolean neg = false;
long last = 0;
while (cur[0] < s.length() && s.charAt(cur[0]) != ')') {
char c = s.charAt(cur[0]++);
if (c == ' ') continue;
if (c == '(') {
long br = inner(s, cur);
sol += neg ? 0 - br : br; //加或者减 的处理
} else if (c == '+' || c == '-') {
sol += neg ? 0 - last : last; //加或者减 的处理
last = 0;
neg = c == '-';
} else {
last = last * 10 + (c - '0');
//while...
}
}
cur[0]++;
sol += neg ? 0 - last : last;
return sol;
}
}
Sample & Demo Code
class Solution {
public int calculate(String s) {
Stack<Integer> stack = new Stack<>();
int sign = 1, res = 0;
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(Character.isDigit(c)) { //判断是不是数字
int cur = c - '0'; //char转int
while(i + 1 < s.length() && Character.isDigit(s.charAt(i + 1)))
cur = cur * 10 + s.charAt(++i) - '0';
res = res + sign * cur;
}else if(c == '+') {
sign = 1;
}else if(c == '-') {
sign = -1;
}else if(c == '(') {
stack.push(res);
stack.push(sign);
sign = 1; res = 0;
}else if(c == ')'){
res = stack.pop() * res + stack.pop(); //先取出之前记录的正负标记
}
}
return res;
}
}
ERROR CODE
class Solution {
public int calculate(String s) {
// if(String.isDigit(s)) return 0;
Stack<Character> stack = new Stack<>();
stack.push('0');
stack.push('+');
for(int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch(c) {
case ' ':
break;
case '+':
stack.push(c);break;
case '-':
stack.push(c);break;
case '(':
stack.push(c);break;
case ')':
long a = 0;
while(!stack.isEmpty() && stack.peek() != '(') {
long atemp = stack.pop();
if(stack.peek() != '(') {
if(stack.pop() == '+')
a += atemp;
else
a -= atemp;
}else
a += atemp;
}
if(!stack.isEmpty()) stack.pop();
System.out.println(a);
if(a < 0) {
if(stack.pop() == '+') stack.push('-');
else stack.push('+');
a *= -1;
}
char pc = (char) a;
stack.push(pc);
break;
default:
long temp = Integer.valueOf(c) - 48;
while(i < s.length()-1 && Character.isDigit(s.charAt(i + 1))) {
long t = Integer.valueOf(s.charAt(++i)) - 48;
temp = temp*10 + t;
}
stack.push((char)temp);
break;
}
}
System.out.println("---------");
long a = 0, atemp;
while(!stack.isEmpty()) {
if(stack.size() == 1) atemp = 0;
else atemp = stack.pop();
System.out.println(atemp);
if(!stack.isEmpty()) {
if(stack.pop() == '+') a += atemp;
else a -= atemp;
}else {
a += atemp;
}
}
return (int)a;
}
}