224. 基本计算器
题目:
思路:
【1】无
代码展示:
//时间10 ms 击败 75.48% //内存42.9 MB 击败 44.49% class Solution { public int calculate(String s) { Deque<Integer> ops = new LinkedList<Integer>(); ops.push(1); int sign = 1; int ret = 0; int n = s.length(); int i = 0; while (i < n) { if (s.charAt(i) == ' ') { i++; } else if (s.charAt(i) == '+') { sign = ops.peek(); i++; } else if (s.charAt(i) == '-') { sign = -ops.peek(); i++; } else if (s.charAt(i) == '(') { ops.push(sign); i++; } else if (s.charAt(i) == ')') { ops.pop(); i++; } else { long num = 0; while (i < n && Character.isDigit(s.charAt(i))) { num = num * 10 + s.charAt(i) - '0'; i++; } ret += sign * num; } } return ret; } } //时间1 ms 击败 100% //内存42.9 MB 击败 41.82% class Solution { int len; public int calculate(String s) { char[] cs = s.toCharArray(); this.len = cs.length; return backTrack(cs, 0)[0]; } // 元素 1 表示 区间 和 元素2 表示区间的右边界 public int[] backTrack(char[] cs, int p){ char c = ' '; char op = '+'; int res = 0; int num = 0; for(int i = p; i < len; ++i){ c = cs[i]; if(c > 47 && c < 58) num = num * 10 + c - 48; else if(c == '+' || c == '-'){ res = op == '+' ? res + num : res - num; op = c; num = 0; }else if(c == '('){ int[] sub = backTrack(cs, i + 1); num = sub[0]; //更新边界 i = sub[1]; }else if(c == ')'){ res = op == '+' ? res + num : res - num; return new int[]{res, i}; } } res = op == '+' ? res + num : res - num; return new int[]{res, len}; } } //时间4 ms 击败 97.54% //内存42.7 MB 击败 57.50% class Solution { public int calculate(String s) { /*存放当前的计算结果*/ int result = 0; /*存放当前待计算数字*/ int num = 0; /*符号,加号(+1)或者减号(-1)*/ int sign = 1; Deque<Integer> stack = new LinkedList<>(); char[] charArray = s.toCharArray(); for (int i = 0; i < charArray.length; i++) { char c = charArray[i]; /*如果当前字符为' ',无需处理*/ if (c == ' ') { continue; } /*如果当前字符是一个数字,则用num进行记录,当然需要考虑到数字不止一位 所以 num = num * 10 + c - '0'*/ if (c >= '0' && c <= '9') { num = num * 10 + c - '0'; if (i < charArray.length - 1 && '0' <= charArray[i + 1] && charArray[i + 1] <= '9') { continue; } } /*如果当前字符为计算符号*/ else if (c == '+') { num = 0; sign = 1; } else if (c == '-') { num = 0; sign = -1; } /*如果当前符号为'(',需要将前面的计算结果和符号入栈。 存在括号里套括号的情况,所以使用栈*/ else if (c == '(') { stack.push(result); stack.push(sign); result = 0; sign = 1; } /*如果当前符号为')',括号里的表达式已经计算完成了, 可以和括号外的结果进行合并计算了*/ else if (c == ')') { /*计算符号出栈*/ sign = stack.pop(); /*将num替换为括号中的计算结果*/ num = result; /*将result替换为括号前边的计算结果*/ result = stack.pop(); } /*每循环一次,得到一个新的结果*/ result += sign * num; } return result; } }