Tengo este error en una pregunta de LeetCode . La publicación en la sección de discusión está aquí . lo estoy haciendo en JS pero me da error al ejecutar con algunas preguntas
Descripción:
Dado un número de columna entero, devuelva su título de columna correspondiente tal como aparece en una hoja de Excel.
Por ejemplo:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...Mi solución:
/** * @param {number} columnNumber * @return {string} */ var convertToTitle = function(columnNumber) { const alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]; var name = ""; while (columnNumber > 0) { name = name.concat(alphabet[columnNumber%26 - 1]); columnNumber = columnNumber - columnNumber%26; } return(name); }; Cuando llamo a la función con colNumber < 26, funciona de maravilla, pero ¿por qué el código falla cuando lo ejecuto con un número mayor? Creo que es un bucle infinito, pero no estoy seguro.
Puedes intentar depurar en el papel, te ayudará mucho.
Imagina que tienes una entrada = 27
como primer bucle será
while (columnNumber > 0) { name = name.concat(alphabet[columnNumber %26 - 1]); # columnNumber = 27- 27%26; # columnNumber = 27 - 1 , new columnNumber will be 26 }parece que funciona perfectamente, pero ¿qué sucede cuando ejecuta el segundo bucle con el nuevo valor columnNumber = 26?
while (columnNumber > 0) { name = name.concat(alphabet[columnNumber %26 - 1]); # columnNumber = columnNumber - columnNumber %26; # columnNumber = 26 - 26%26 , 26 mod 26 = 0 # then you will get you inf loop 26 - 0 }¡Buen ejercicio! Código rápido y sucio:
function convertToTitle(columnNumber) { columnNumber -= 1; let name = ""; let alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]; while (columnNumber >= 0) { if (columnNumber > alphabet.length - 1) { name = name.concat(alphabet[Math.floor(columnNumber / 25) - 1]); columnNumber -= Math.floor(columnNumber / 25) * 25; columnNumber -= 1; } else { name = name.concat(alphabet[columnNumber]); break; } } return name; } Editar:
Salida de consola
Explicación:
1 -> A, pero un Array comienza en el índice 0, entonces columnNumber -= 1
27 -> AB, saca la base (A) dividiendo por 25 ( alphabet.length - 1 ) y el resto de la división
Si columnNumber es <26 (ya sabes, el índice comienza en 0) podemos obtener el carácter directamente.
Una forma un poco más limpia sería el uso de String.charAt(index)
const alphabet = "ABCDEFGHJKLMNOPQRSTUVWXYZ"; alphabet.charAt(0); // returns char at 0 -> A