Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет
Задача leetcode #150 (среда): оценить обозначение обратного польского языка
Описание:
( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++
Оценить ценность арифметической экспрессии в обозначениях обратного польского.
Действительные операторы +
, -
, *
и /
Анкет Каждый операнд может быть целым числом или другим выражением.
Примечание Это разделение между двумя целыми числами должно усеться в сторону нуля.
Гарантируется, что заданное выражение RPN всегда действительное. Это означает, что выражение всегда будет оцениваться в результате, и не будет никакого разделения с помощью нулевой работы.
Примеры:
Вход: | токены = [ “2”,”1″,”+”,”3″,”*”] |
Выход: | 9 |
Объяснение: | ((2 + 1) * |
Вход: | токены = [“4″,”13″,”5″,”/”,”+”] |
Выход: | 6 |
Объяснение: | (4 + (13 / |
Вход: | токены = [“10″,”6″,”9″,”3″,”+”,”-11″,””,”/”,””,”17″,”+”,”5″,”+”] |
Выход: | 22 |
Объяснение: | ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + + |
Ограничения:
1.length^4
токены [i]
либо оператор:"+"
,"-"
,"*"
, или"/"
, или целое число в диапазоне[-200, 200]
.
Идея:
( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++
Обратная польская нотация был разработан специально для упрощения вычислений с более эффективным использованием куча . Итак, мы можем использовать стек Здесь хранить номера, пока они не будут использоваться, и тогда каждый операнд будет использовать два лучших значения куча .
Поскольку порядок чисел по -прежнему важен для вычитания и деления, мы должны убедиться, что два числа обрабатываются в их первоначальном порядке, который является противоположным порядком стек Анкет
После каждой успешной операции результат должен быть перенесен обратно на стек пока он не будет использован. После завершения итерации оставшееся значение в стек Будет нашим ответом, поэтому мы должны вернуть стек [0] Анкет
- Сложность времени: O (n) куда N является длиной токены
- Сложность пространства: O (n) для длины куча , вплоть до N/2 + 1 ценности
- или O (1) с использованием на месте
Реализация:
Значения объекта JavaScript могут быть функциями, поэтому мы можем хранить операции непосредственно в объекте «Оценка» как Lambda функции.
Код JavaScript:
( Прыгните к : Описание задачи Идея решения
let a, b const evaluate = {"+": ()=>a+b, "-": ()=>a-b, "*": ()=>a*b, "/": ()=>~~(a/b)} var evalRPN = function(tokens) { let stack = [] for (let t of tokens) { if (evaluate[t]) { b = stack.pop(), a = stack.pop() stack.push(evaluate[t]()) } else stack.push(~~t) } return stack[0] };
Код Python:
( Прыгните к : Описание задачи Идея решения
class Solution: def evalRPN(self, tokens: List[str]) -> int: stack = [] for t in tokens: if t not in {"+", "-", "*", "/"}: stack.append(int(t)) else: b, a = stack.pop(), stack.pop() if t == "+": stack.append(a + b) elif t == "-": stack.append(a - b) elif t == "*": stack.append(a * b) else: stack.append(trunc(a / b)) return stack[0]
Код Java:
( Прыгните к : Описание задачи Идея решения
class Solution { private Setops = new HashSet<>(Arrays.asList("+", "-", "*", "/")); public int evalRPN(String[] tokens) { Stack stack = new Stack<>(); for (String t : tokens) { if (!ops.contains(t)) stack.push(Integer.parseInt(t)); else { int b = stack.pop(), a = stack.pop(); if (t.equals("+")) stack.push(a + b); else if (t.equals("-")) stack.push(a - b); else if (t.equals("*")) stack.push(a * b); else stack.push(a / b); } } return stack.pop(); } }
C ++ Код:
( Прыгните к : Описание задачи Идея решения
static unordered_setops({"+", "-", "*", "/"}); class Solution { public: int evalRPN(vector & tokens) { stack stack; for (auto t : tokens) { if (ops.find(t) == ops.end()) stack.push(stoi(t)); else { int b = stack.top(); stack.pop(); int a = stack.top(); stack.pop(); if (t == "+") stack.push(a + b); else if (t == "-") stack.push(a - b); else if (t == "*") stack.push(a * b); else stack.push(a / b); } } return stack.top(); } };
Оригинал: “https://dev.to/seanpgallivan/solution-evaluate-reverse-polish-notation-192l”