[Práctica diaria] - problema de Josefo

Descripción del problema

0,1, n-1, que están dispuestos en un círculo números n, comenzando desde el número 0, elimine el m-ésimo dígitos, cada vez desde el interior del círculo. Encuentra el círculo en el que el último dígito restante.
El título proviene del leetcode, haga clic para entrar

Leer título

Por ejemplo, 0,1,2,3,4 cinco números en un círculo, cada deleción de tres números empezando por el número 0, los cuatro primeros dígitos de la secuencia suprimida es 2,0,4,1, por lo que la final el número restante es 3.

Una solución

solución más intuitiva

public int lastRemaining(int n, int m) {
        LinkedList<Integer> list = new LinkedList<>();
        // 全部加进去
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        // 只要链表长度不为 1,就不断循环
        while (list.size() != 1) {
            for (int i = 0; i < m; i++) {
            	// 取出第一个元素并删除
                Integer pre = list.pollFirst();
                if (i != m - 1) {
                	// 如果不是第m个,就加到末尾
                    list.add(pre);
                }
            }
        }
        return list.pollFirst();
}

solución de dos

En primer lugar, establecer los valores de m bits n eliminan de forma continua, el valor resultante de f(n,m)
la primera suprimido digital se (m-1)%ndenota x
entonces el restante n-1 se convierte en un digital (supone aquí que n es mayor que 2)

0 1 ... x-1 x + 1 ... n-1

Debido a la necesidad de un recuento después se elimina el número, primero en X + 1, los nuevos números están dispuestos en el orden

La matriz original Correspondiente a la posición ordinal
x + 1 0
x + 2 1
... ...
n-1 nx-2
0 nx-1
... ...
x-1 n-2

¿Por qué posición 0 corresponde a nx-1?
El primer paso cuando hemos borrado un número que puede ser entendido como esta lista se divide en dos partes, la
longitud de la primera parte de x (porque es a partir de 0),
entonces la longitud de la segunda parte de la misma es n-x-1
ahora la primera parte del mosaico detrás de la segunda parte,
entonces el primer número de la primera división, es decir 0, se convierte en una n-x-1+1, es decir, los números de nx digital, ya que es a partir de cero, de modo que los correspondientes n-x-1
puntos clave:
Supongamos la secuencia correspondiente a la posición a, el valor original de B
a continuación, las posiciones secuenciales de relación una y valores B, podemos sacar la fórmula:

B = (A+x+1) mod n

Puede ser obtenido a partir de la definición inicial:
. N-ésimo dígito de 1-m-ésimo eliminar continuamente el último valor obtenido f(n-1,m)
de la ecuación anterior que puede ser empujado de nuevo a su valor inverso (f(n-1,m)+x+1)%n
del valor definido al principio es que f(n-1,m)
estaremos x=(m-1)%nsustituido en simplificado disponibles :

f(n,m)=f(n−1,m)+m) mod n,且f(1,m) = 0

la implementación del código

 public static int lastRemaining(int n, int m) {
        return n == 1 ? 0 : (lastRemaining(n-1,m) + m) % n;
    }

o

public int lastRemaining(int n, int m) {
    int flag = 0;   
    for (int i = 2; i <= n; i++) {
        flag = (flag + m) % i;
    }
    return flag;
}
Publicado 26 artículos originales · ganado elogios 6 · vistas 2933

Supongo que te gusta

Origin blog.csdn.net/weixin_45676630/article/details/105211561
Recomendado
Clasificación