diff --git a/LeetCode/medium/evalRPN_150.py b/LeetCode/medium/evalRPN_150.py new file mode 100644 index 0000000..040a41c --- /dev/null +++ b/LeetCode/medium/evalRPN_150.py @@ -0,0 +1,21 @@ +import operator +from typing import List + + +class Solution: + def evalRPN(self, tokens: List[str]) -> int: + ops = {"+": operator.add, "-": operator.sub, "/": operator.truediv, "*": operator.mul} + stack = [] + + for token in tokens: + if token in ops: + num_1 = stack.pop() + num_2 = stack.pop() + operation = ops[token] + res = operation(int(num_2), int(num_1)) + stack.append(res) + else: + stack.append(token) + + return int(stack[0]) + # NOTE: we could append token as int() then we wouldn't need to convert it before return or operation diff --git a/tests/test_leetcode_medium.py b/tests/test_leetcode_medium.py index 38197f5..bc84628 100644 --- a/tests/test_leetcode_medium.py +++ b/tests/test_leetcode_medium.py @@ -199,6 +199,32 @@ def test_longest_consecutive(nums, expected): assert result == expected +@pytest.mark.parametrize( + "tokens, expected", + [ + (["2", "1", "+", "3", "*"], 9), + (["4", "13", "5", "/", "+"], 6), + ( + ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"], + 22, + ), + (["3"], 3), + (["5", "1", "2", "+", "4", "*", "+", "3", "-"], 14), + (["-2", "3", "+"], 1), + (["7", "-3", "/"], -2), # truncates toward zero + (["18", "3", "/"], 6), + (["2", "3", "*"], 6), + (["8", "2", "-"], 6), + ], +) +def test_eval_rpn(tokens, expected): + from LeetCode.medium.evalRPN_150 import Solution + + result = Solution().evalRPN(tokens) + + assert result == expected, f"expected: {expected}, but got: {result}, input: {tokens}" + + # 05: Longest Palindromic Substring # https://leetcode.com/problems/longest-palindromic-substring/?envType=problem-list-v2&envId=hash-table