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.
Mündəricat
Problem bəyanat
The Sayın və Deyin LeetCode Həlli - "Count and De" sizdən tapmağı xahiş edir bu n
th 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” yoldurcountAndSay(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:
- Bu problemi həll etmək üçün əsas fikir istifadə etməkdir Recursion.
- 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.
- Həmçinin, bizə lazımdır tam ədədlərin sətirlərə uyğunlaşdırılması.
- 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.
- Sətir üçün təkrarlayın və tapın ardıcıl eyni simvolların sayı və xarakter növü.
- 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
