Reverse Polşa Notation LeetCode Həllini qiymətləndirin

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Çiy kərpic Amazon alma Atlassian Citadel Qapılar Facebook google LinkedIn microsoft Kahin VMware Yandex
Toptal VMvareBaxılıb 75

Sistem dizaynı ilə bağlı müsahibə sualları o qədər açıq ola bilər ki, düzgün hazırlaşmağı bilmək çox çətindir. İndi satın aldıqdan sonra Amazon, Microsoft və Adobe-nin dizayn dövrlərini sındıra bilirəm Bu kitabı. Gündəlik bir yenidən nəzərdən keçirin dizayn sualı və söz verirəm ki, dizayn dövrünü sındıra bilərsiniz.

Problem bəyanat

Reverse Polşa Notation LeetCode Həllini qiymətləndirin – Arifmetik ifadənin dəyərini qiymətləndirin Tərs Polşa Notası.

Etibarlı operatorlar var +-*və /. Hər bir operand tam və ya başqa bir ifadə ola bilər.

Qeyd iki tam ədəd arasındakı bölgü sıfıra doğru kəsilməlidir.

Verilmiş RPN ifadəsinin həmişə etibarlı olduğuna zəmanət verilir. Bu o deməkdir ki, ifadə həmişə nəticəni qiymətləndirəcək və sıfır əməliyyatına bölmə olmayacaq.

Input: tokens = ["2","1","+","3","*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9

Izahat

Postfiks ifadəsini əl ilə qiymətləndirdiyimiz zaman a istifadə etmək üçün eyni yanaşmaya əməl edəcəyik qalaq və cari işarənin operator və ya operand olmasına əsaslanan əməliyyatın yerinə yetirilməsi.

Postfiks ifadəsini qiymətləndirmək normal ifadəni qiymətləndirməkdən daha asandır, çünki operatorun üstünlüyü barədə narahat olmaq lazım deyil.
Postfiks ifadəsinin strukturu aşağıdakı kimidir:
ab*, burada a və b operandlar və ya ifadələrin özləri ola bilər və * operatordur.

Beləliklə, bizim vəzifəmiz əvvəlcə a, sonra b-ni qiymətləndirmək, sonra onları (a * b) kimi birləşdirməkdir.
Bu, bir yığın istifadə edərək asanlıqla edilə bilər.
Bu alqoritmə əməl edərək operand yığınını saxlayaraq bütün sətir üzərində təkrar edirik:

  1. Cari işarə əməliyyatdırsa, 2-ci addıma, əks halda 4-cü addıma keçin
  2. İlk iki elementi yığından çıxarın. Onlar müvafiq olaraq b və a olacaqlar (çünki operandların sırası yığına görə tərsinə çevrilir).
  3. Lazım olan əməliyyatı yerinə yetirin (a * b) və nəticəni yığına geri itələyin. 5-ci addıma keçin.
  4. Cari tokenin tam təsvirini yığına itələyin.
  5. Bütün tokenlər massivi keçənə qədər 1-dən 4-ə qədər olan addımları təkrarlayın.
  6. Yığın üst elementini qaytarın.

Kodu

Tərs Polşa Notasiyasını Qiymətləndirmək üçün C++ Kodu

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        unordered_map<string, function<int (int, int) > > map = {
            { "+" , [] (int a, int b) { return a + b; } },
            { "-" , [] (int a, int b) { return a - b; } },
            { "*" , [] (int a, int b) { return a * b; } },
            { "/" , [] (int a, int b) { return a / b; } }
        };
        std::stack<int> stack;
        for (string& s : tokens) {
            if (!map.count(s)) {
                stack.push(stoi(s));
            } else {
                int op1 = stack.top();
                stack.pop();
                int op2 = stack.top();
                stack.pop();
                stack.push(map[s](op2, op1));
            }
        }
        return stack.top();
    }
};

Ters Polşa notasını qiymətləndirmək üçün Java kodu

import java.util.Stack;

public class Solution {
    public int evalRPN(String[] tokens) {
        int a,b;
    Stack<Integer> S = new Stack<Integer>();
    for (String s : tokens) {
      if(s.equals("+")) {
        S.add(S.pop()+S.pop());
      }
      else if(s.equals("/")) {
        b = S.pop();
        a = S.pop();
        S.add(a / b);
      }
      else if(s.equals("*")) {
        S.add(S.pop() * S.pop());
      }
      else if(s.equals("-")) {
        b = S.pop();
        a = S.pop();
        S.add(a - b);
      }
      else {
        S.add(Integer.parseInt(s));
      }
    }	
    return S.pop();
  }
}

Tərs Polyak Notation Qiymətləndirmək üçün Python Kodu

class Solution:
    # @param {string[]} tokens
    # @return {integer}
    def __init__(self):
        self.operators = {
            '+': lambda y, x: x + y,
            '-': lambda y, x: x - y,
            '*': lambda y, x: x * y,
            '/': lambda y, x: int(operator.truediv(x, y))
        }

    def evalRPN(self, tokens):
        if not tokens:
            return 0

        stack = []

        for token in tokens:
            if token in self.operators:
                stack.append(self.operators[token](stack.pop(), stack.pop()))
            else:
                stack.append(int(token))

        return stack[0]

Əks Polyak Notation LeetCode Həllini Qiymətləndirmək üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi

O (N)

Kosmik Mürəkkəblik

O (N)

Crack Sistemi Dizayn Müsahibələri
Translate »