LeetCode224 BasicCalculator java题解

题目:

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ),
the plus + or minus sign -, non-negative integers
and empty spaces .

You may assume that the given expression is always valid.

Some examples:

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

解答:

对应这类题型通用的做法是转成后缀表达式,然后根据逆波兰的计算方法进行计算。但这题比较特殊,因为它只有加减,我们可以通过化简括号进行计算,比如“1-(2-(4-6)+5)+3”

在这个表达式中,总共有1 2 4 6 5 3这几个数字,我们只要弄清楚这些数字的最终符号是什么,最终符号取决于数字前面的符号与数字前面所有左括号前面的那个符号的成绩,比如2:+1*(-1) 4:+1*(-1)*(-1) 5:+1*(-1)*(-1) 知道这个就应该看得懂代码了

代码:

 public static int calculate(String s) {
		 char[] array=s.toCharArray();
		 Stack<Integer> stack=new Stack<>();
		 int result=0;
		 int sign=1;
		 stack.push(1);
		 for(int i=0;i<array.length;i++)
		 {
			 if(Character.isDigit(array[i]))
			 {
				 int num=array[i]-'0';
				 int j=i+1;
				 while(j<array.length&&Character.isDigit(array[j]))
				 {
					 num=10*num+array[j]-'0';
					 j++;
				 }
				 result+=sign*stack.peek()*num;
				 i=j-1;//j前面等于i+1
			 }
			 else if(array[i]=='+')
				 sign=1;
			 else if(array[i]=='-')
				 sign=-1;
			 else if(array[i]=='(')//记录左括号之前的那个符号,因为它会影响括号里面的所有运算符
			 {
				 stack.push(sign*stack.peek());
				 sign=1;
			 }
			 else if(array[i]==')')//保证之前左括号来的时候压入栈的那个符号不会影响后面那些不在括号中的运算
				 stack.pop();

			 else {
				;//空格什么的就不操作
			}

		 }
		 return result;

	    }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 17:02:43

LeetCode224 BasicCalculator java题解的相关文章

LeetCode71 Simplify Path java题解

题目: Given an absolute path for a file (Unix-style), simplify it. For example, path = "/home/", => "/home" path = "/a/./b/../../c/", => "/c" 题解: 解题思路:这题是简化目录,每一级目录前面都有一个斜杠,我可以首先对斜杠进行分割,分割之后得到的结果无外乎4种情况:正常目录名称,空

LeetCode229 MajorityElementII java题解

<p>题目:</p><p><span style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">Given an integer array of size </span><span style="box-sizi

LeetCode257 BinaryTreePaths(打印根节点到叶子节点的左右路径) Java题解

题目: Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 / 2 3 5 All root-to-leaf paths are: ["1->2->5", "1->3"] 题解: 用深度优先遍历,类似二叉树的前序变遍历 代码: public class LeetCode257_BinaryTreePat

LeetCode108_Convert SortedArray to BinarySearchTree(将有序数组转成二叉排序树) Java题解

题目: Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 题解: 和我上面一篇将有序链表转成二叉排序树中用哈希表解的方法是一样的.基本思路:链表中间那个节点为树的根节点.根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点.后面就依照这个规律依次类推了. public static TreeNode s

LeetCode102 Binary Tree Level Order Traversal Java题解

题解: Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example: Given binary tree {3,9,20,#,#,15,7}, 3 / 9 20 / 15 7 return its level order traversal as: [ [3], [9,20], [15,7] ] 解

LeetCode110 Blanced Binary Tree Java 题解

题目: Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 题解: 判断一颗二叉树是不是平衡二叉树  ,平衡二叉树是每个节

LeetCode234_PalindromeLinkedList (推断是否为回文链表) Java题解

题目: Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time and O(1) space? 题解: 推断一个链表是不是回文的,这里要求O(n)时间复杂度和O(1)的空间时间复杂度.总共想了三种办法,三种办法都用到了两个指针,符合题目要求的仅仅有最后一种. 第一种办法:用数组倒着存前半段的链表的值.然后和后半段链表的值进行比較. 这样的解法执行的时间

LeetCode109_Convert Sorted List to Binary Search t题目tiTree(将链表转成二叉排序树) Java题解

题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题解:将一个有序链表转成二叉排序树,如果是一棵相对平衡的排序树,应该是这样的,链表中间那个节点为树的根节点,根节点的左子树节点应该是根节点左边那部分的中间节点,根节点的右节点应该是根节点右边那部分链表的中间节点,后面就按照这个规律依次类推了.知道上面的规律之后,问题的关键

TopCoder SRMS 1 字符串处理问题 Java题解

Problem Statement   Let's say you have a binary string such as the following: 011100011 One way to encrypt this string is to add to each digit the sum of its adjacent digits. For example, the above string would become: 123210122 In particular, if P i