Reverse Integer
Este problema consiste en tomar un número de 32 bits y luego invertirlo
Solución
La siguiente fue mi primera solución
# @param {Integer} x
# @return {Integer}
def reverse(x)
positive = x>=0? 1:-1
x = x.abs
max = 2147483647
max_rm = max%10
min = -max - 1
min_rm = min%10
num = 0
while x!=0
dig = x%10
x = x / 10
if (num > max/10 || (num==max/10 && dig>=max_rm))
return 0
end
if (num < min/10 || (num==min/10 && dig<=min_rm))
return 0
end
num*=10
num+=dig
end
num *= positive
num
end
Este programa primero toma el valor absoluto del número y guarda si es positivo o negativo, esto porque en algunos lenguajes el módulo de los números negativos funciona de diferentes maneras.
Luego guardamos como constante el valor de 2**31 y lo asignamos a unas variables para que no lo tenga que recomputar en cada ciclo, como algunas veces lo hace ruby.
Este programa fue más o menos como lo había pensado, la parte de verificar que el número no pase los límites de los 32 bits fue la que tuve que buscar.
Note que también tenía unas divisiones que seguramente ruby recomputaba en cada iteración y las asigné a unas variables antes de empezar el ciclo para ver si esto lo hacía más rápido y así fue:
# @param {Integer} x
# @return {Integer}
def reverse(x)
positive = x>=0? 1:-1
x = x.abs
max = 2147483647
max_rm = max%10
max_10 = max / 10
min = -max - 1
min_rm = min%10
min_10 = min / 10
num = 0
while x!=0
dig = x%10
x = x / 10
if (num > max_10 || (num==max_10 && dig>=max_rm))
return 0
end
if (num < min_10 || (num==min_10 && dig<=min_rm))
return 0
end
num*=10
num+=dig
end
num *= positive
num
end