Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 1fe65c6

Browse files
solves #224: Basic Calculator in java
1 parent 2e02d14 commit 1fe65c6

File tree

3 files changed

+63
-69
lines changed

3 files changed

+63
-69
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@
190190
| 221 | [Maximal Square](https://leetcode.com/problems/maximal-square) | [![Java](assets/java.png)](src/MaximalSquare.java) | |
191191
| 222 | [Count Complete Tree Nodes](https://leetcode.com/problems/count-complete-tree-nodes) | [![Java](assets/java.png)](src/CountCompleteTreeNodes.java) | |
192192
| 223 | [Rectangle Area](https://leetcode.com/problems/rectangle-area) | [![Java](assets/java.png)](src/RectangleArea.java) | |
193+
| 224 | [Basic Calculator](https://leetcode.com/problems/basic-calculator) | [![Java](assets/java.png)](src/BasicCalculator.java) | |
193194
| 225 | [Implement Stack using Queues](https://leetcode.com/problems/implement-stack-using-queues) | [![Java](assets/java.png)](src/MyStack.java) [![Python](assets/python.png)](python/implement_stack_using_queues.py) | |
194195
| 226 | [Invert Binary Tree](https://leetcode.com/problems/invert-binary-tree) | [![Java](assets/java.png)](src/InvertBinaryTree.java) [![Python](assets/python.png)](python/invert_binary_tree.py) | |
195196
| 227 | [Basic Calculator II](https://leetcode.com/problems/basic-calculator-ii) | [![Java](assets/java.png)](src/BasicCalculatorII.java) | |

src/BasicCalculator.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import java.util.Stack;
2+
3+
class BasicCalculator {
4+
public int calculate(String s) {
5+
final Stack<Integer> stack = new Stack<Integer>();
6+
int number = 0;
7+
int result = 0; // For the ongoing result
8+
int sign = 1; // 1 means positive, -1 means negative
9+
10+
for (int i = 0; i < s.length(); i++) {
11+
final char ch = s.charAt(i);
12+
13+
if (Character.isDigit(ch)) {
14+
number = 10 * number + (ch - '0');
15+
} else if (isOperator(ch)) {
16+
result += sign * number;
17+
number = 0;
18+
sign = ch == '+' ? 1 : -1;
19+
} else if (ch == '(') {
20+
stack.push(result);
21+
stack.push(sign);
22+
sign = 1;
23+
result = 0;
24+
} else if (ch == ')') {
25+
result += sign * number;
26+
result *= stack.pop();
27+
result += stack.pop();
28+
number = 0;
29+
}
30+
}
31+
32+
return result + (sign * number);
33+
}
34+
35+
private static boolean isOperator(char c) {
36+
return c == '+' || c == '-';
37+
}
38+
}

src/HelloWorld.java

Lines changed: 24 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,35 @@
1-
import java.util.ArrayList;
2-
import java.util.Arrays;
3-
import java.util.List;
1+
import java.util.Set;
2+
import java.util.Stack;
43

54
public class HelloWorld {
6-
public static int[][] insert(int[][] intervals, int[] newInterval) {
7-
if (intervals.length == 0) {
8-
return new int[][] { newInterval };
9-
}
10-
11-
final int startIndex = binarySearch(intervals, newInterval[0]);
12-
13-
final List<int[]> result = new ArrayList<>();
14-
for (int i = 0 ; i < startIndex ; i++) {
15-
result.add(intervals[i]);
16-
}
17-
result.add(newInterval);
18-
for (int i = startIndex ; i < intervals.length ; i++) {
19-
result.add(intervals[i]);
20-
}
21-
22-
return mergeIntervals(result);
23-
}
24-
25-
private static int[][] mergeIntervals(List<int[]> intervals) {
26-
final List<int[]> result = new ArrayList<>();
27-
int start = intervals.getFirst()[0], end = intervals.getFirst()[1];
28-
for (int[] interval : intervals) {
29-
if (interval[0] <= end) {
30-
end = Math.max(interval[1], end);
5+
private static final Set<String> OPERATORS = Set.of("+", "-", "*", "/");
6+
7+
public int evalRPN(String[] tokens) {
8+
final Stack<Integer> stack = new Stack<>();
9+
for (String token : tokens) {
10+
if (isOperator(token)) {
11+
final int second = stack.pop();
12+
final int first = stack.pop();
13+
final int result = apply(token, first, second);
14+
stack.push(result);
3115
} else {
32-
result.add(new int[]{start, end});
33-
start = interval[0];
34-
end = interval[1];
16+
stack.push(Integer.parseInt(token));
3517
}
3618
}
37-
result.add(new int[] { start, end });
38-
return toArray(result);
19+
return stack.peek();
3920
}
4021

41-
private static int binarySearch(int[][] intervals, int x) {
42-
int left = 0, right = intervals.length - 1, middle;
43-
while (left <= right) {
44-
middle = left + (right - left) / 2;
45-
if (intervals[middle][0] == x) return middle;
46-
else if (intervals[middle][0] < x) left = middle + 1;
47-
else right = middle - 1;
48-
}
49-
return left;
22+
private static boolean isOperator(String token) {
23+
return OPERATORS.contains(token);
5024
}
5125

52-
private static int[][] toArray(List<int[]> intervals) {
53-
final int[][] result = new int[intervals.size()][2];
54-
int k = 0;
55-
for (int[] interval : intervals) {
56-
result[k++] = interval;
57-
}
58-
return result;
59-
}
60-
61-
public static void main(String[] args) {
62-
// System.out.println(Arrays.deepToString(
63-
// insert(new int[][]{{1, 3}, {6, 9}}, new int[] {2, 5})
64-
// ));
65-
66-
// System.out.println(Arrays.deepToString(
67-
// insert(
68-
// new int[][] {{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}},
69-
// new int[] {4, 8}
70-
// )
71-
// ));
72-
73-
System.out.println(Arrays.deepToString(
74-
insert(
75-
new int[][] {{1, 3}, {6, 9}},
76-
new int[] {2, 5}
77-
)
78-
));
26+
private static int apply(String operator, int first, int second) {
27+
return switch (operator) {
28+
case "+" -> first + second;
29+
case "-" -> first - second;
30+
case "/" -> first / second;
31+
case "*" -> first * second;
32+
default -> 0;
33+
};
7934
}
8035
}

0 commit comments

Comments
 (0)