Pensando en la escuela privada: una línea de código para resolver el algoritmo

Para algunos problemas algorítmicos, siempre que domine la idea, puede usar un código corto para implementarla. Por ejemplo, las siguientes preguntas:

Poder de dos

problema

Determina si un número es 2 elevado a la enésima potencia

responder

Al encontrar la potencia de 2, debemos establecer la idea de operación de desplazamiento. Si n es una potencia de dos, es decir, el bit más alto es 1 y las otras posiciones son 0, entonces n-1 es el bit más alto es 0 , y las posiciones restantes son 1, entonces n & (n-1) es 0

1boolean isPowerOfTow(int n){
    
    
2    return (n>0)%%(n&(n-1))==0;
3}

Poder de tres

problema

Determina si un número es 3 elevado a n

responder

Si el tipo int no se desborda, la potencia más alta de 3 es 1162261467, por lo que siempre que este número se reduzca a 0, entonces el divisor de n es solo tres, que es 3 elevado a la n potencia.

El mismo enfoque también se puede aplicar a cuestiones como potencias de 5, potencias de 7 y potencias de X (X es un número primo).

1boolean isPowerOfThree(int n){
    
    
2    return (n>0)&&(116261467%n)==0;
3}

Número de binarios

problema

Dado un número n, encuentre el número 1 en la representación binaria en la que n se convierte

responder

JDK Dafa es bueno, use el método incorporado directamente:

  • bitCount: devuelve el número de unos en binario
  • lowerOneBit: Devuelve la posición del bit 1 más bajo en la representación binaria
  • HighestOneBit: Devuelve la posición del bit 1 más alto en la representación binaria.
  • numberOfLeadingZeros: Devuelve el número de ceros de orden superior en la representación binaria
  • numberOfTrailingZeros: Devuelve el número de ceros de orden inferior en la representación binaria.
1 int bitCount(int num) {
    
    
2        return Integer.bitCount(num);
3    }

O no puede usar la solución de la biblioteca jdk

1int bitOfOne(int num) {
    
    
2        return num == 0 ? 0 : 1 + bitOfOne(num & (num - 1));
3    }

Cero después del factorial

problema

Dado un número n, pregunte por n! El número de ceros en los dígitos.

responder

Para este tipo de problema, tenemos que analizar la causa de 0, porque 10 = 5 2, para una n! En términos de números, ¡el número con 0 al final es n! El número de veces 5 a 2 se incluye en el divisor de , porque el número de veces de 2 es suficiente, es decir, ¡esta pregunta equivale a encontrar n! El número del divisor de 5 (tenga en cuenta que para números como 25, el divisor incluye 2 5).

1int zeroAtTheEndCount(int num) {
    
    
2        return num / 5 + zeroAtTheEndCount(num / 5);
3    }

Luz apagada

problema

Hay x luces, y un interruptor controla una luz. Al presionar el interruptor se apagará o encenderá la luz. Ahora las luces están todas apagadas. Realizamos n operaciones, y cada operación presiona todos los interruptores numerados como múltiplos de i, que es

  • Presione todos los interruptores numerados como múltiplos de 1
  • Presione todos los interruptores numerados como múltiplos de 2
  • ...
  • Presione todos los interruptores numerados como múltiplos de x

Sabiendo que el número total de luces es x, encuentre el número de las últimas luces encendidas

responder

En primer lugar, tome arbitrariamente el número n de la lámpara, ¿cuántas operaciones afectarán el estado de esta lámpara? La respuesta es el número de todos los divisores de n.

Por ejemplo, la lámpara numerada 12, los divisores de 12 son 1, 2, 3, 4, 6, 12. Es decir, el estado de la lámpara numerada 12 se cambiará 6 veces, respectivamente, cuando el conmutador se cambie 1, 2, 3, 4, 6 y 12 veces.

Luego considere las siguientes dos situaciones:

  • Supongamos que n es un número no cuadrado: porque el divisor de un número no cuadrado es un número par, es decir, el estado se cambiará veces pares, es decir, el estado no cambiará.
  • Suponga que n es un número cuadrado perfecto: el divisor de un número cuadrado perfecto es impar y su estado cambiará.

Luego, de acuerdo con los requisitos del tema, todas las luces están apagadas al principio. Encontrar la cantidad de luces en el estado iluminado es la cantidad de números que cambiarán, lo que equivale a encontrar la cantidad de números cuadrados perfectos entre 1 y X.

1int lightCount(int num) {
    
    
2        return (int) Math.sqrt(num);
3    }

Número extraño

problema

Dada una matriz no vacía, donde a excepción de un elemento solo aparece una vez, otros elementos aparecen dos veces, busque el elemento que aparece solo una vez

responder

Uno de los operadores clave aquí es el operador ^ XOR, que utiliza principalmente las siguientes reglas que satisface la operación XOR a ^ b:

  • a ^ b = b ^ a ley conmutativa
  • a ^ b ^ c = a ^ (b ^ c) ley asociativa
  • a ^ a = 0, al mismo tiempo 0 ^ 0 = 0
  • 0 ^ a = a
1int loseNumber(int[] num) {
    
    
2        return Arrays.stream(num).reduce(0, (n1, n2) -> n1 ^ n2);
3    }

Problema del anillo de joseph

problema

Los n soldados numerados 1-n forman un círculo, comenzando con el soldado número 1, el número de soldados será eliminado y los futuros soldados volverán a informar el número hasta que quede un soldado. Pregunte por el número de soldados. Serial número

responder

Antes de eliminar (antiguo) Después de eliminar (nuevo)
m-2 n-2
m-1 n-1
metro No
m + 1 1
m + 2 2
  • Supongamos que antiguo es el número de nodo antes de la eliminación y nuevo es el número de nodo después de la eliminación.

  • -Relación: antiguo = (nuevo + m-1)% n + 1

Nota: No es antiguo = (nuevo + m)% n, porque la numeración comienza desde 1 en lugar de 0. Si nuevo + m == n, conducirá al resultado del cálculo final antiguo = 0.

1int f(int n,int m){
    
    
2    if(n==1
3        return n;
4    return (f(n-1,m)+m-1)%n+1;
5}

Por fin

  • Si sientes que eres recompensado después de leerlo, espero que le prestes atención. Por cierto, dame un pulgar hacia arriba. Esta será la mayor motivación para mi actualización. Gracias por tu apoyo.
  • Bienvenidos a todos para que presten atención a mi cuenta pública [Java Fox], enfocándome en los conocimientos básicos de Java y la computadora, prometo dejarles obtener algo después de leerlo, si no me creen, péguenme
  • Busque la conexión triple con un clic: me gusta, reenviar y mirar.
  • Si tiene diferentes opiniones o sugerencias después de leer, por favor comente y comparta con nosotros. Gracias por su apoyo y cariño.

——Soy Chuhu, y amo la programación tanto como a ti.

imagen
imagen
> Bienvenido a seguir la cuenta pública "Java Fox" para conocer las últimas noticias

Supongo que te gusta

Origin blog.csdn.net/issunmingzhi/article/details/112861562
Recomendado
Clasificación