Sayın və Deyin Leetcode Həlli

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Çiy kərpic Amazon alma Bloomberg Facebook JPMorgan
SimBaxılıb 87

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

The Sayın və Deyin LeetCode Həlli - "Count and De" sizdən tapmağı xahiş edir bu nth müddəti saymaq və söyləmək ardıcıllıq.

The saymaq və söyləmək ardıcıllıq rekursiv düsturla müəyyən edilmiş rəqəm sətirlərinin ardıcıllığıdır:

  • countAndSay(1) = "1"
  • countAndSay(n) rəqəm sətirini “deyəcəyiniz” yoldur countAndSay(n-1), daha sonra fərqli rəqəm sətirinə çevrilir.

Rəqəm sətrini necə “deyəcəyimizi” öyrənmək üçün əvvəlcə sətri minimum sayda ardıcıl simvol qruplarına bölün. İndi hər bir qrup üçün əvvəlcə simvolların sayını, sonra isə simvolu göstərin.

Misal:

Input:  n = 1
Output: "1"

Explanation:

  • n = 1 rekursiyanın əsas halıdır, buna görə də cavab 1-dir.
Input:  n = "4"
Output: "1211"

Explanation:

  • CountAndSay(1) = “1”.
  • CountVe Say(2) = “1” = bir dəfə 1 = “11” deyin.
  • CountVe De (3) = “11” = iki dəfə 1 = “21” deyin.
  • CountAndSay(4) = “21” = bir dəfə 2 və bir dəfə 1 = “1211” deyin.

Yanaşma

Idea:

  1. Bu problemi həll etmək üçün əsas fikir istifadə etməkdir Recursion.
  2. Bu problem həm də iterativ metoddan istifadə etməklə, hər dəfə əvvəlki sətri seçərək və cari cavabı almaq üçün sətir üzərində işləməklə səmərəli şəkildə həll edilə bilər.
  3. Həmçinin, bizə lazımdır tam ədədlərin sətirlərə uyğunlaşdırılması.
  4. n-ci ardıcıllığın cavabını tapmaq üçün əvvəlki ardıcıllıqla əldə edilmiş sətiri nəzərdən keçirin.
  5. Sətir üçün təkrarlayın və tapın ardıcıl eyni simvolların sayıxarakter növü.
  6. Cari cavabı tapmaq üçün xəritədən istifadə edin.

Kodu

Say və Söylə Leetcode C++ Həlli:

class Solution {
public:
    string countAndSay(int n) {
        vector<string> dp(n+1);
        dp[1] = "1";
        vector<string> conv = {"","1","2","3","4","5","6","7","8","9"};
        for(int i=2;i<=n;i++){
            int cnt = 1;
            for(int j=1;j<dp[i-1].length();j++){
                if(dp[i-1][j]==dp[i-1][j-1]){
                    cnt++;
                }
                else{
                    dp[i] += conv[cnt];
                    dp[i] += dp[i-1][j-1];
                    cnt = 1;
                }
            }
            dp[i] += conv[cnt];
            dp[i] += dp[i-1].back();
        }
        return dp.back();
    }
};

Say və Söylə Leetcode Java Həlli:

class Solution {
    public String Count(String s){
        int cnt = 1;
        char ch = s.charAt(0);
        StringBuilder curr = new StringBuilder();
        for(int i=1;i<s.length();i++){
            if(s.charAt(i)==ch){
                cnt++;
            }
            else{
                curr.append(cnt);
                curr.append(ch);
                ch = s.charAt(i);
                cnt = 1;
            }
        }
        curr.append(cnt);
        curr.append(ch);
        return curr.toString();
    }
    public String countAndSay(int n) {
        String s = "1";
        for(int i=1;i<n;i++){
            s = Count(s);
        }
        return s;
    }
}

Say və Say Leetcode Həlli üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O (N * L), burada N = ardıcıllığın n-ci üzvü və L = sətirin maksimum uzunluğu.

Biz n dəfə keçdiyimizdən və hər dəfə L sətirinin maksimum uzunluğu üçün təkrarlayacağımız üçün zamanın mürəkkəbliyi O(N*L) olur.

Kosmik Mürəkkəblik

Yuxarıdakı kodun kosmik mürəkkəbliyi O (N). Bütün cavabları saxlamaq üçün N ölçülü xətti vektordan istifadə edirik.

Referans: https://en.wikipedia.org/wiki/Recurrence_relation

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