Quiero crear una función que devuelva verdadero si un número tiene dígitos consecutivos o no,
ejemplo:
Mi solución en este momento es transformar el número en una matriz y recorrer el número uno por uno, si el siguiente número es igual al número actual, simplemente devolvemos verdadero. Pero esto tiene un tiempo de complejidad de O (n) y me preguntaba si alguien puede encontrar una solución mejor.
Gracias
Podría decirse que existe una solución mejor en la que no necesita convertir el número en una cadena o matriz de números/carácter. Funciona de la siguiente manera:
curr a -1 .while num > 0 y haga lo siguiente:next_curr = num % 10if next_curr == curr: return truecurr = next_currnum = num / 10 (división entera) Este es un algoritmo de complejidad de tiempo O(log n) de un paso donde n es el número de entrada. La complejidad del espacio es O(1)
Tenga en cuenta que si bien su algoritmo también tenía una complejidad de tiempo O (log n O(log n) , realizó 2 pases y también tenía una complejidad de espacio de O(log n) .
No he escrito JS desde hace algún tiempo, pero aquí hay una posible implementación del algoritmo anterior en JS:
function sameAdjacentDigits(num) { // to deal with negative numbers and // avoid potential problems when using Math.floor later num = Math.abs(num) let curr = -1 while (num > 0) { const nextCurr = num % 10 if (nextCurr == curr) return true curr = nextCurr num = Math.floor(num / 10) } return false }Use algunas expresiones regulares y luego verifique lo que se encontró a través del comparador
numbers_match = /(00|11|22|33|44|55|66|77|88|99)/; numbers_match.match("11")https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
La forma más fácil de ejecutar esto es mediante el uso de expresiones regulares. No estoy seguro de cuál sería la efectividad del algoritmo, pero la solución podría ser
/(\d)\1/