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.