Oggi vediamo il seguente esercizio di LeetCode:

Given a roman numeral, convert it to an integer.

Possiamo risolvere questo problema scorrendo la stringa e gestendo separatamente i casi “standard” e quelli in cui una cifra più piccola precede una più grande (notazione sottrattiva), come nel codice proposto.

L’idea chiave è:

  • utilizziamo una mappa per associare ogni simbolo romano al suo valore numerico
  • scorriamo la stringa carattere per carattere
  • per ogni simbolo, controlliamo se forma una coppia speciale (IV, IX, XL, XC, CD, CM)
  • se sì, sottraiamo il valore corrente da quello successivo e saltiamo il prossimo carattere
  • altrimenti, sommiamo semplicemente il valore del simbolo corrente
  • continuiamo fino alla fine della stringa

Questo approccio permette di ottenere una complessità O(n), dove n è la lunghezza della stringa, ed è efficace nel gestire correttamente tutti i casi. Tuttavia, nel codice proposto la gestione delle coppie speciali è suddivisa in più funzioni (checkI, checkX, checkC), rendendo la soluzione più verbosa: può essere semplificata confrontando direttamente il valore corrente con quello successivo in un unico passaggio.

Detto ciò, la soluzione che proponiamo noi è la seguente:

function romanToInt(s: string): number {
    let mapRomanToInteger: Map<string, number> = new Map<string, number>();
    mapRomanToInteger.set('I', 1);
    mapRomanToInteger.set('V', 5);
    mapRomanToInteger.set('X', 10);
    mapRomanToInteger.set('L', 50);
    mapRomanToInteger.set('C', 100);
    mapRomanToInteger.set('D', 500);
    mapRomanToInteger.set('M', 1000);
    let sum = 0;

    for(let i = 0; i < s.length; i++){
        if(checkI(s, i) || checkX(s, i) || checkC(s, i)){
            sum += mapRomanToInteger.get(s[i+1]) - mapRomanToInteger.get(s[i]);
            i++;
        }
        else
           sum += mapRomanToInteger.get(s[i]); 
        console.log(sum)
    }

    return sum;
};

function checkI(s: string, i: number): boolean{
   return s[i] == 'I' && i+1 < s.length && (s[i+1] == 'V' || s[i+1] == 'X');
}

function checkX(s: string, i: number): boolean{
   return s[i] == 'X' && i+1 < s.length && (s[i+1] == 'L' || s[i+1] == 'C');
}

function checkC(s: string, i: number): boolean{
   return s[i] == 'C' && i+1 < s.length && (s[i+1] == 'D' || s[i+1] == 'M');
}

Se hai dubbi in merito non esitare a contattarci sui nostri social, saremo più che felici di risponderti :)