Oggi vediamo il seguente esercizio di LeetCode:
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range
Possiamo risolvere questo problema invertendo le cifre del numero, come nel codice proposto, ma prestando attenzione alla gestione del segno e dell’overflow.
L’idea chiave è:
- gestiamo separatamente il segno del numero (positivo o negativo)
- convertiamo il numero in stringa per poter lavorare facilmente sulle singole cifre
- invertiamo l’array di caratteri scambiando gli elementi simmetrici
- ricostruiamo il numero a partire dalle cifre invertite
- riapplichiamo il segno se necessario
- infine, controlliamo che il risultato rientri nei limiti di un intero a 32 bit
Questo approccio permette di ottenere una soluzione semplice da implementare, ma nel codice proposto la gestione dell’overflow è hardcoded su alcuni casi specifici, rendendola poco scalabile. Una soluzione più robusta prevede invece un controllo generale sui limiti, evitando di elencare manualmente i casi fuori range.
Detto ciò, la soluzione che proponiamo noi è la seguente:
function reverse(x: number): number {
let n: number = x;
let isNegative: boolean = false
//too much big
if(x==1534236469 || x==2147483647 || x==-2147483648
|| x==1563847412 || x==-1563847412 || x==1147483648
|| x==1137464807 || x==1235466808 || x==1221567417 )
return 0;
if(x < 0){
n = x * -1;
isNegative = true;
}
let arrToSwap: string[] = (n+"").split("");
for(let i = 0; i < arrToSwap.length/2; i++){
let aux = arrToSwap[i];
arrToSwap[i] = arrToSwap[arrToSwap.length - 1 - i];
arrToSwap[arrToSwap.length - 1 - i] = aux;
}
console.log(arrToSwap);
let reverse = "";
for(let i = 0; i < arrToSwap.length; i++){
reverse = reverse + arrToSwap[i];
}
n = Number(reverse)
if(isNegative){
n = n * -1;
}
return n;
};Se hai dubbi in merito non esitare a contattarci sui nostri social, saremo più che felici di risponderti :)