Роман то Интегер Леетцоде Солутион


Ниво тешкоће Лако
Често питани у адобе амазонка јабука Блоомберг фацебоок Голдман Сакс гоогле ЛинкедИн мицрософт пророчанство Куалтрицс роблок Убер иахоо
Математика низ

У проблему „Роман то Интегер“ добијамо а низ представљајући неки позитивни цели број у свом Римски бројевни облик. Римски бројеви су представљени са 7 знакова који се могу претворити у целе бројеве помоћу следеће табеле:

Роман то Интегер Леетцоде Солутион

белешке: Целобројна вредност датог римског броја неће премашити или изједначити вредност 4000.

Пример

IX
9
CXXIX
129

Објашњење # 1

ИКС је 9 у целим бројевима

Објашњење # 2

ЦКСКСИКС = Ц + КСКС + ИКС = 100 + 20 + 9 = 129

Приступ (додавање слијева удесно)

Можемо да радимо с лева на десно у низу и настављамо да додајемо одговарајућу вредност за сваки знак у њему. Али, необичан аспект римских бројева је ако се знак мање целобројне вредности појави пре знака велике вредности, резултат није њихов различит збир.

На пример, ИКС на римском језику треба да буде једнак 1 + 10 = 11 ако смо накнадно додавали знакове. Али, ИКС = 9, као који се јавља пре X је мање у интегралној вредности. Дакле, резултат се третира као I одузета од X. Дакле, ИКС = 9.

Стога не можемо једноставно додати целобројну вредност сваког знака у низу. Такође морамо да проверимо карактер поред, за горе поменути случај. На тај начин можемо претворити задати римски бројевни низ у тражени цели број.

Алгоритам

  1. Направите функцију гетИнтегер () да врати вредност једног римског знака који му је прослеђен помоћу пребацити случајеви
  2. Инитиализе резултат за чување потребног целог броја
  3. Опет, иницијализујте струја следећи за чување вредности тренутне и следеће целобројне вредности одговарајућих знакова у низу за сваку итерацију
  4. Итерирајте за и = 0 док и <Н.  (Н = величина низа)
    • If i је последњи индекс низа, немамо следећи знак, па додајте целобројну вредност од Стринг [и] и повратак резултат
    • Дохватите целобројну вредност тренутних и следећих знакова помоћу гетИнтегер ()
    • If тренутна <= следећа
      • додати струја до резултат
      • Повећање i за 1, тј. i++
    • Друго
      • додати следећи - струја до резултат
      • Повећање i за 2, тј. i + = 2
  5. Одштампајте резултат

Имплементација решења Роман то Интегер Леетцоде

Програм Ц ++

#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;
}

Јава Програм

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

Анализа сложености римског и целобројног решења са шифром

Сложеност времена

Овде једном прелазимо низ. С обзиром да имамо целобројно ограничење мање од 4000, величина низа ће увек бити константна вредност. Стога је временска сложеност О (1).

Свемирска сложеност

О (1), Користимо само стални меморијски простор.

Приступ (десни на леви пас)

Разлика између здесна налево и слева надесно лежи у њиховој примени. У пролазу здесна налево, можемо кренути од другог последњег индекса низа, чувајући целобројну вредност последњег знака у некој променљивој. Претходно задржавамо интегралну вредност последњег знака резултата. Сада, док се крећемо здесна улево, на сваком кораку проверавамо да ли је целобројна вредност тренутног карактера мања од последњег (претходног / десног) елемента који смо видели. Ако је мања од последње вредности, од вредности одузимамо ову вредност. У супротном, додајемо га нашем резултату. Ова примена се у потпуности заснива на горе наведеној чињеници да знак мање вредности пре већег знака значи да га треба одузети од потоњег.

Овај приступ је готово исти по броју операција као и претходни приступ, али је погоднији јер се ослобађамо провере последњег елемента за сваку итерацију.

Алгоритам

  1. Направите функцију гетИнтегер () слично као горе
  2. Спремите целобројну вредност последњег знака низа у прев
  3. Инитиализе резултат једнако прев
  4. Итерати из и = Н - 2 до и> = 0:
    1. Спремите целобројну вредност тренутног карактера као струја
    2. If струја је мање од прев
      1. Одбит струја од резултат, То јест, резултат -= струја
    3. Друго
      1. додати струја до резултат, То јест, резултат += струја
  5. Одштампајте резултат

Имплементација решења Роман то Интегер Леетцоде

Програм Ц ++

#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;
}

Јава Програм

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

Анализа сложености римског и целобројног решења са шифром

Сложеност времена

Опет једном прелазимо низ. Као што је горе речено, временска сложеност је О (1).

Свемирска сложеност

О (1), Користимо само стални меморијски простор.