mirror of
https://github.com/devenperez/leetcode.git
synced 2026-06-15 09:57:09 +00:00
Compare commits
2 Commits
c45b01a838
...
3c88ab7152
| Author | SHA1 | Date | |
|---|---|---|---|
| 3c88ab7152 | |||
| cbef5fb714 |
@@ -0,0 +1,60 @@
|
|||||||
|
class Solution:
|
||||||
|
def calculate(self, s: str) -> int:
|
||||||
|
"""
|
||||||
|
Complexities:
|
||||||
|
Time: O(n)
|
||||||
|
Space: O(n)
|
||||||
|
|
||||||
|
where n = len(s)
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
numbers = "0123456789"
|
||||||
|
|
||||||
|
# Read from left to right: save in stack (full number or operator)
|
||||||
|
# - save number
|
||||||
|
# - on operator:
|
||||||
|
# -- if * or /, evaluate
|
||||||
|
# -- if + or -, wait and continue
|
||||||
|
currentNumber = 0
|
||||||
|
stack = []
|
||||||
|
|
||||||
|
# Evaluate numbers and create stack (of additions + subtractions)
|
||||||
|
for c in s + "\0":
|
||||||
|
if c == " ":
|
||||||
|
continue
|
||||||
|
elif c in numbers:
|
||||||
|
digit = int(c)
|
||||||
|
currentNumber = (currentNumber * 10) + digit
|
||||||
|
else:
|
||||||
|
stack.append(currentNumber)
|
||||||
|
currentNumber = 0
|
||||||
|
|
||||||
|
if len(stack) >= 3 and stack[-2] in "*/":
|
||||||
|
rOperand = stack.pop()
|
||||||
|
operator = stack.pop()
|
||||||
|
lOperand = stack.pop()
|
||||||
|
|
||||||
|
if operator == "*":
|
||||||
|
stack.append(lOperand * rOperand)
|
||||||
|
elif operator == "/":
|
||||||
|
stack.append(int(lOperand / rOperand))
|
||||||
|
|
||||||
|
stack.append(c)
|
||||||
|
|
||||||
|
# Pop off null terminator
|
||||||
|
stack.pop()
|
||||||
|
|
||||||
|
# Evaluate all additions and subtractions from stack
|
||||||
|
current = stack[0]
|
||||||
|
for i in range(1, len(stack) - 1, 2):
|
||||||
|
operator = stack[i]
|
||||||
|
rOperand = stack[i + 1]
|
||||||
|
|
||||||
|
if operator == "+":
|
||||||
|
current += rOperand
|
||||||
|
elif operator == "-":
|
||||||
|
current -= rOperand
|
||||||
|
|
||||||
|
return current
|
||||||
|
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<h2><a href="https://leetcode.com/problems/basic-calculator-ii">227. Basic Calculator II</a></h2><h3>Medium</h3><hr><p>Given a string <code>s</code> which represents an expression, <em>evaluate this expression and return its value</em>. </p>
|
||||||
|
|
||||||
|
<p>The integer division should truncate toward zero.</p>
|
||||||
|
|
||||||
|
<p>You may assume that the given expression is always valid. All intermediate results will be in the range of <code>[-2<sup>31</sup>, 2<sup>31</sup> - 1]</code>.</p>
|
||||||
|
|
||||||
|
<p><strong>Note:</strong> You are not allowed to use any built-in function which evaluates strings as mathematical expressions, such as <code>eval()</code>.</p>
|
||||||
|
|
||||||
|
<p> </p>
|
||||||
|
<p><strong class="example">Example 1:</strong></p>
|
||||||
|
<pre><strong>Input:</strong> s = "3+2*2"
|
||||||
|
<strong>Output:</strong> 7
|
||||||
|
</pre><p><strong class="example">Example 2:</strong></p>
|
||||||
|
<pre><strong>Input:</strong> s = " 3/2 "
|
||||||
|
<strong>Output:</strong> 1
|
||||||
|
</pre><p><strong class="example">Example 3:</strong></p>
|
||||||
|
<pre><strong>Input:</strong> s = " 3+5 / 2 "
|
||||||
|
<strong>Output:</strong> 5
|
||||||
|
</pre>
|
||||||
|
<p> </p>
|
||||||
|
<p><strong>Constraints:</strong></p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><code>1 <= s.length <= 3 * 10<sup>5</sup></code></li>
|
||||||
|
<li><code>s</code> consists of integers and operators <code>('+', '-', '*', '/')</code> separated by some number of spaces.</li>
|
||||||
|
<li><code>s</code> represents <strong>a valid expression</strong>.</li>
|
||||||
|
<li>All the integers in the expression are non-negative integers in the range <code>[0, 2<sup>31</sup> - 1]</code>.</li>
|
||||||
|
<li>The answer is <strong>guaranteed</strong> to fit in a <strong>32-bit integer</strong>.</li>
|
||||||
|
</ul>
|
||||||
Reference in New Issue
Block a user