Algoritmo de búsqueda del ciclo de Freud

Escribe un algoritmo para determinar si un número n es un número feliz.

El "Número feliz" se define como:

Para un número entero positivo, cada vez que el número se reemplaza por la suma de los cuadrados de los dígitos en cada una de sus posiciones. Luego repita este proceso hasta que el número se convierta en 1, o puede ser un ciclo infinito pero nunca se convierte en 1. Si el resultado de este proceso es 1, entonces el número es un número feliz. Devuelve verdadero si n es un número feliz; de lo contrario, devuelve falso.

Ejemplo:

输入: n = 19
输出: true
解释: 12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
复制代码

Algoritmo de búsqueda del ciclo de Freud

Este algoritmo tiene dos corredores, uno que corre rápido y otro que corre lento. En la fábula de la carrera entre la tortuga y la liebre, el corredor lento se llama "tortuga" y el corredor rápido se llama liebre.

No importa dónde comiencen la tortuga y la liebre en el ciclo, eventualmente se encontrarán. Esto se debe a que la liebre mueve un nodo más cerca de la tortuga (en la dirección de su movimiento) con cada paso.

imagen.png

imagen.png

imagen.png

imagen.png

imagen.png

imagen.png

imagen.png

imagen.png

En lugar de solo realizar un seguimiento de un valor en la lista vinculada, realizamos un seguimiento de dos valores, llamados corredor rápido y corredor. En cada paso del algoritmo, los corredores lentos avanzan 1 nodo en la lista enlazada y los corredores rápidos 2 nodos (llamadas anidadas a la función getNext(n)).

Si  n fuera un número feliz, es decir, sin bucles, el corredor rápido acabaría llegando al número 1 antes que el lento.

Si  n no es un número feliz, eventualmente los corredores rápidos y los corredores se encontrarán en el mismo número.

class Solution {

     public int getNext(int n) {
        int totalSum = 0;
        while (n > 0) {
            int d = n % 10;
            n = n / 10;
            totalSum += d * d;
        }
        return totalSum;
    }

    public boolean isHappy(int n) {
        int slowRunner = n;
        int fastRunner = getNext(n);
        while (fastRunner != 1 && slowRunner != fastRunner) {
            slowRunner = getNext(slowRunner);
            fastRunner = getNext(getNext(fastRunner));
        }
        return fastRunner == 1;
    }
}
复制代码

Supongo que te gusta

Origin juejin.im/post/7085143939174367263
Recomendado
Clasificación