Skip to content

Commit 7528ce2

Browse files
committed
leetcode
1 parent 7ec8c91 commit 7528ce2

File tree

4 files changed

+301
-0
lines changed

4 files changed

+301
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/*
2+
3+
-* 150. Evaluate Reverse Polish Notation *-
4+
5+
6+
7+
Evaluate the value of an arithmetic expression in Reverse Polish Notation.
8+
9+
Valid operators are +, -, *, and /. Each operand may be an integer or another expression.
10+
11+
Note that division between two integers should truncate toward zero.
12+
13+
It is guaranteed that the given RPN expression is always valid. That means the expression would always evaluate to a result, and there will not be any division by zero operation.
14+
15+
16+
17+
Example 1:
18+
19+
Input: tokens = ["2","1","+","3","*"]
20+
Output: 9
21+
Explanation: ((2 + 1) * 3) = 9
22+
Example 2:
23+
24+
Input: tokens = ["4","13","5","/","+"]
25+
Output: 6
26+
Explanation: (4 + (13 / 5)) = 6
27+
Example 3:
28+
29+
Input: tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
30+
Output: 22
31+
Explanation: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
32+
= ((10 * (6 / (12 * -11))) + 17) + 5
33+
= ((10 * (6 / -132)) + 17) + 5
34+
= ((10 * 0) + 17) + 5
35+
= (0 + 17) + 5
36+
= 17 + 5
37+
= 22
38+
39+
40+
Constraints:
41+
42+
1 <= tokens.length <= 104
43+
tokens[i] is either an operator: "+", "-", "*", or "/", or an integer in the range [-200, 200].
44+
45+
*/
46+
47+
import 'dart:collection';
48+
49+
class A {
50+
int evalRPN(List<String> tokens) {
51+
late int a, b;
52+
List<int> s = [];
53+
for (String token in tokens) {
54+
try {
55+
s.add(int.parse(token));
56+
} catch (e) {
57+
a = s.removeLast();
58+
b = s.removeLast();
59+
switch (token) {
60+
case "+":
61+
s.add(b + a);
62+
break;
63+
case "-":
64+
s.add(b - a);
65+
break;
66+
case "*":
67+
s.add(b * a);
68+
break;
69+
case "/":
70+
s.add(b ~/ a);
71+
break;
72+
}
73+
}
74+
}
75+
return s.removeLast();
76+
}
77+
}
78+
79+
class B {
80+
int evalRPN(List<String> tokens) {
81+
if (tokens.isEmpty || tokens.length == 0) {
82+
return 0;
83+
}
84+
int len = tokens.length;
85+
List<int> result = List.filled(len, 0);
86+
int pointer = 0;
87+
for (int i = 0; i < len; i++) {
88+
String current = tokens[i];
89+
if (isDigit(current[current.length - 1])) {
90+
result[pointer++] = int.parse(current);
91+
} else {
92+
if (current == "+") {
93+
result[pointer - 2] += result[--pointer];
94+
} else if (current == "-") {
95+
result[pointer - 2] -= result[--pointer];
96+
} else if (current == "*") {
97+
result[pointer - 2] *= result[--pointer];
98+
} else {
99+
result[pointer - 2] ~/= result[--pointer];
100+
}
101+
}
102+
}
103+
return result[0];
104+
}
105+
106+
bool isDigit(String s) {
107+
if (s.isEmpty) {
108+
return false;
109+
}
110+
return int.tryParse(s) != null;
111+
}
112+
}
113+
114+
class C {
115+
int evalRPN(List<String> tokens) {
116+
List<int> s = [];
117+
HashSet<String> op = HashSet()..addAll(["+", "-", "*", "/"]);
118+
for (String c in tokens) {
119+
if (op.contains(c)) {
120+
int p2 = s.removeLast();
121+
int p1 = s.removeLast();
122+
s.add(execOp(p1, p2, c));
123+
} else {
124+
s.add(int.parse(c));
125+
}
126+
}
127+
128+
return s.removeLast();
129+
}
130+
131+
int execOp(int p1, int p2, String op) {
132+
switch (op) {
133+
case "+":
134+
return p1 + p2;
135+
case "-":
136+
return p1 - p2;
137+
case "*":
138+
return p1 * p2;
139+
case "/":
140+
return p1 ~/ p2;
141+
}
142+
143+
return 0;
144+
}
145+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import "strconv"
4+
5+
var m = map[string]func(int, int) int{
6+
"+": func(lhs, rhs int) int { return lhs + rhs },
7+
"-": func(lhs, rhs int) int { return lhs - rhs },
8+
"*": func(lhs, rhs int) int { return lhs * rhs },
9+
"/": func(lhs, rhs int) int { return lhs / rhs },
10+
}
11+
12+
func evalRPN(tokens []string) int {
13+
var stk []int
14+
for _, val := range tokens {
15+
var num int
16+
if fn, ok := m[val]; ok {
17+
var lhs, rhs int
18+
stk, lhs, rhs = popTopTwo(stk)
19+
num = fn(lhs, rhs)
20+
} else {
21+
num, _ = strconv.Atoi(val)
22+
}
23+
24+
stk = append(stk, num)
25+
}
26+
27+
return stk[0]
28+
}
29+
30+
func popTopTwo(stk []int) ([]int, int, int) {
31+
rhs := stk[len(stk)-1]
32+
stk = stk[:len(stk)-1]
33+
34+
lhs := stk[len(stk)-1]
35+
stk = stk[:len(stk)-1]
36+
37+
return stk, lhs, rhs
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# 🔥 3 Approaches 🔥 || Simple Fast and Easy || with Explanation
2+
3+
## Explanation
4+
5+
Loop through tokens, push integers into a stack, and pop two from stack if token is not an integer, calculate the result, push result back into stack.
6+
7+
## Solution - 1 STACK
8+
9+
```dart
10+
class Solution {
11+
int evalRPN(List<String> tokens) {
12+
late int a, b;
13+
List<int> s = [];
14+
for (String token in tokens) {
15+
try {
16+
s.add(int.parse(token));
17+
} catch (e) {
18+
a = s.removeLast();
19+
b = s.removeLast();
20+
switch (token) {
21+
case "+":
22+
s.add(b + a);
23+
break;
24+
case "-":
25+
s.add(b - a);
26+
break;
27+
case "*":
28+
s.add(b * a);
29+
break;
30+
case "/":
31+
s.add(b ~/ a);
32+
break;
33+
}
34+
}
35+
}
36+
return s.removeLast();
37+
}
38+
}
39+
```
40+
41+
## Solution - 2
42+
43+
```dart
44+
bool isDigit(String s) {
45+
if (s.isEmpty) {
46+
return false;
47+
}
48+
return int.tryParse(s) != null;
49+
}
50+
}
51+
```
52+
53+
```dart
54+
class Solution {
55+
int evalRPN(List<String> tokens) {
56+
if (tokens.isEmpty || tokens.length == 0) {
57+
return 0;
58+
}
59+
int len = tokens.length;
60+
List<int> result = List.filled(len, 0);
61+
int pointer = 0;
62+
for (int i = 0; i < len; i++) {
63+
String current = tokens[i];
64+
if (isDigit(current[current.length - 1])) {
65+
result[pointer++] = int.parse(current);
66+
} else {
67+
if (current == "+") {
68+
result[pointer - 2] += result[--pointer];
69+
} else if (current == "-") {
70+
result[pointer - 2] -= result[--pointer];
71+
} else if (current == "*") {
72+
result[pointer - 2] *= result[--pointer];
73+
} else {
74+
result[pointer - 2] ~/= result[--pointer];
75+
}
76+
}
77+
}
78+
return result[0];
79+
}
80+
```
81+
82+
## Solution - 3
83+
84+
```dart
85+
class Solution {
86+
int evalRPN(List<String> tokens) {
87+
List<int> s = [];
88+
HashSet<String> op = HashSet()..addAll(["+", "-", "*", "/"]);
89+
for (String c in tokens) {
90+
if (op.contains(c)) {
91+
int p2 = s.removeLast();
92+
int p1 = s.removeLast();
93+
s.add(execOp(p1, p2, c));
94+
} else {
95+
s.add(int.parse(c));
96+
}
97+
}
98+
99+
return s.removeLast();
100+
}
101+
102+
int execOp(int p1, int p2, String op) {
103+
switch (op) {
104+
case "+":
105+
return p1 + p2;
106+
case "-":
107+
return p1 - p2;
108+
case "*":
109+
return p1 * p2;
110+
case "/":
111+
return p1 ~/ p2;
112+
}
113+
114+
return 0;
115+
}
116+
}
117+
```

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ This repo contain leetcode solution using DART and GO programming language. Most
168168
- [**931.** Minimum Falling Path Sum](MinimumFallingPathSum/minimum_falling_path_sum.dart)
169169
- [**198.** House Robber](HouseRobber/house_robber.dart)
170170
- [**1143.** Longest Common Subsequence](LongestCommonSubsequence/longest_common_subsequence.dart)
171+
- [**150.** Evaluate Reverse Polish Notation](EvaluateReversePolishNotation/evaluate_reverse_polish_notation.dart)
171172

172173
## Reach me via
173174

0 commit comments

Comments
 (0)