Roman - Tam Leetcode Həlli

Çətinlik səviyyəsi Asan
Tez-tez soruşulur Çiy kərpic Amazon alma Bloomberg Facebook Goldman Sachs google LinkedIn microsoft Kahin Kvalifikasiya ROBLOX Über Yahoo
alqoritmlər kodlaşdırma müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions Riyaziyyat SimBaxılıb 171

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.

"Romadan Tamsayıya" problemində bizə a sim içərisində bəzi müsbət ədədi təmsil edir Roman rəqəm forması. Roma rəqəmləri aşağıdakı cədvəldən istifadə edərək tam ədədə çevrilə bilən 7 simvolla təmsil olunur:

Roman - Tam Leetcode HəlliPin

Qeyd: Verilən roman rəqəminin tam dəyəri 4000-dən çox olmayacaq və ya ona bərabər olmayacaqdır.

misal

IX
9
CXXIX
129

İzahat # 1

IX tam ədədə 9-dur

İzahat # 2

CXXIX = C + XX + IX = 100 + 20 + 9 = 129

Yanaşma (soldan sağa ötürmə)

Dizidəki soldan sağa keçid edə bilərik və içindəki hər bir simvol üçün uyğun dəyər əlavə edə bilərik. Lakin, roman rəqəmlərinin özünəməxsus cəhəti budur ki, yüksək bir dəyərdən əvvəl daha az tam dəyərli bir xarakter meydana gəlsə, nəticə onların fərqli cəmi deyil.

Məsələn, sonradan simvol əlavə etsək, roman dilindəki IX 1 + 10 = 11-ə bərabər olmalıdır. Ancaq IX = 9, olduğu kimi əvvəllər baş verir X ayrılmaz dəyərində azdır. Beləliklə, nəticə kimi davranılır I çıxarıldı X. Beləliklə, IX = 9.

Buna görə, simvoldakı hər bir simvolun tam dəyərini sadəcə əlavə edə bilmərik. Yuxarıda qeyd olunan hal üçün yanındakı xarakteri də yoxlamalıyıq. Bu şəkildə verilmiş roman ədədi sətrini lazım olan tam ədədə çevirə bilərik.

Alqoritm

  1. Bir funksiya yaradın getInteger () istifadə edərək ona ötürülmüş bir roman xarakterinin dəyərini qaytarmaq keçid hallarda
  2. Initialize nəticələnəcək tələb olunan tam ədədi saxlamaq üçün
  3. Yenidən başladın cari sonrakı müvafiq təkrarlanan simvolların cari və növbəti tam ədədi dəyərlərini hər təkrar üçün sətirdə saxlamaq
  4. İ = 0 qədər təkrarlayın i <N  (N = massivin ölçüsü)
    • If i massivin son indeksidir, bundan sonrakı simvolumuz yoxdur, ona görə də tam ədədi əlavə edin Simli [i] və qayıt nəticələnəcək
    • Cari və sonrakı simvolların tam sayını istifadə edərək alın getInteger ()
    • If cari <= sonrakı
      • əlavə etmək cari qədər nəticələnəcək
      • Artım i 1 ilə, yəni i++
    • Daha
      • əlavə etmək sonrakı - cari qədər nəticələnəcək
      • Artım i 2 ilə, yəni i + = 2
  5. Nəticəni çap edin

Romandan Tam Tam Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

int getInteger(char c)
{
    switch(c)
    {
        case 'I' : return 1;
        case 'V' : return 5;
        case 'X' : return 10;
        case 'L' : return 50;
        case 'C' : return 100;
        case 'D' : return 500;
        case 'M' : return 1000;
        default : return -1;
    }
}

int romanToInt(string s)
{
    int n = s.size() , result = 0 , current , next , i = 0;
    while(i < n)
    {
        if(i == n - 1)
        {
            result += getInteger(s[i]);
            return result;
        }
        current = getInteger(s[i]) , next = getInteger(s[i + 1]);
        if(current >= next)
            result += current , i++;
        else
            result += next - current , i += 2;
    }
    return result;
}

int main()
{
    string s = "CXXIX";
    cout << romanToInt(s) << '\n';
    return 0;
}

Java Proqramı

class roman_to_int
{
    public static void main(String args[])
    {
        String s = "CXXIX";
        System.out.println(romanToInt(s));
    }

    static int getInteger(char c)
    {
        switch(c)
        {
            case 'I' : return 1;
            case 'V' : return 5;
            case 'X' : return 10;
            case 'L' : return 50;
            case 'C' : return 100;
            case 'D' : return 500;
            case 'M' : return 1000;
            default : return -1;
        }
    }

    static int romanToInt(String s)
    {
        int n = s.length() , result = 0 , current , next , i = 0;
        while(i < n)
        {
            if(i == n - 1)
            {
                result += getInteger(s.charAt(i));
                return result;
            }
            current = getInteger(s.charAt(i));
            next = getInteger(s.charAt(i + 1));
            if(current >= next)
            {
                result += current;
                i++;
            }
            else
            {
                result += next - current;
                i += 2;
            }
        }
        return result;
    }
}
129

Roman - Tam Leetcode Solüsyonunun Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

Budur, ipi bir dəfə keçirik. Tam ədədi 4000-dən az olduğumuz üçün, sətir ölçüsü həmişə sabit bir dəyər olacaqdır. Buna görə zamanın mürəkkəbliyi O (1).

Kosmik mürəkkəblik

O (1), Yalnız daimi yaddaş boşluğundan istifadə edirik.

Yanaşma (sağdan sola ötürmə)

Sağdan sola və soldan sağa olan fərq onların tətbiqindədir. Sağdan Sola keçiddə serialın ikinci son indeksindən başlayaq, son xarakterin tam dəyərini bəzi dəyişənlərdə saxlaya bilərik. Son xarakterin ayrılmaz dəyərini əvvəlcədən nəticəyə saxlayırıq. İndi sağdan sola hərəkət edərkən cari xarakterin tam ədədi dəyəri gördüyümüz son (əvvəlki / sağ) elementdən az olub olmadığını hər addımda yoxlayırıq. Son dəyərdən azdırsa, nəticəni bu dəyəri çıxardırıq. Əks təqdirdə, nəticəmizə əlavə edirik. Bu tətbiqetmə tamamilə yuxarıdakı həqiqətə söykənir ki, daha böyük dəyərli birindən əvvəl kiçik dəyərli xarakter, ikincidən çıxılmalı deməkdir.

Bu yanaşma əməliyyat sayında əvvəlki yanaşma ilə demək olar ki eynidır, lakin hər təkrar üçün son elementi yoxlamaqdan qurtulduğumuz üçün daha rahatdır.

Alqoritm

  1. Bir funksiya yaradın getInteger () yuxarıdakı kimi
  2. Sətrin son işarəsinin tam dəyərini içində saxlayın prev
  3. Initialize nəticələnəcək bərabərdir prev
  4. Dan təkrarlayın i = N - 2 qədər mən> = 0:
    1. Cari xarakterin tam dəyərini aşağıdakı kimi saxlayın cari
    2. If cari azdır prev
      1. Çıxarın cari etibarən nəticələnəcəkKi, nəticələnəcək -= cari
    3. Daha
      1. əlavə etmək cari üçün nəticələnəcəkKi, nəticələnəcək += cari
  5. Nəticəni çap edin

Romandan Tam Tam Leetcode həllinin tətbiqi

C ++ Proqramı

#include <bits/stdc++.h>
using namespace std;

int getInteger(char c)
{
    switch(c)
    {
        case 'I' : return 1;
        case 'V' : return 5;
        case 'X' : return 10;
        case 'L' : return 50;
        case 'C' : return 100;
        case 'D' : return 500;
        case 'M' : return 1000;
        default : return -1;
    }
}

int romanToInt(string s)
{
    int n = s.size();
    int prev = getInteger(s[n - 1]) , result = prev , current;
    for(int i = n - 2 ; i >= 0 ; i--)
    {
        current = getInteger(s[i]);
        if(current < prev)
            result -= current;
        else
            result += current;
        prev = current;
    }
    return result;
}

int main()
{
    string s = "CXXIX";
    cout << romanToInt(s) << '\n';
    return 0;
}

Java Proqramı

class roman_to_int
{
    public static void main(String args[])
    {
        String s = "CXXIX";
        System.out.println(romanToInt(s));
    }

    static int getInteger(char c)
    {
        switch(c)
        {
            case 'I' : return 1;
            case 'V' : return 5;
            case 'X' : return 10;
            case 'L' : return 50;
            case 'C' : return 100;
            case 'D' : return 500;
            case 'M' : return 1000;
            default : return -1;
        }
    }

    static int romanToInt(String s)
    {
        int n = s.length();
        int prev = getInteger(s.charAt(n - 1)) , result = prev , current;
        for(int i = n - 2 ; i >= 0 ; i--)
        {
            current = getInteger(s.charAt(i));
            if(current < prev)
                result -= current;
            else
                result += current;
            prev = current;
        }
        return result;
    }
}
129

Roman - Tam Leetcode Solüsyonunun Mürəkkəblik Analizi

Zamanın mürəkkəbliyi

Yenə də ipi bir dəfə keçirik. Yuxarıda müzakirə edildiyi kimi, zamanın mürəkkəbliyi O (1).

Kosmik mürəkkəblik

O (1), Yalnız daimi yaddaş boşluğundan istifadə edirik.

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