Рубрики
Без рубрики

Решение: оценить обозначения обратного польского языка

Это является частью серии объяснений решений LeetCode (индекс). Если вам понравилось это решение или fou … с меткой алгоритмы, JavaScript, Java, Python.

Это является частью серии объяснений решения 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 Set ops = 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_set ops({"+", "-", "*", "/"});

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”