Tabla de contenido
En segundo lugar, el número de bit 1
1. Comprobación cíclica de bits binarios
2. Optimización de operación de bits
Uno, una potencia de 2
Mira la solución:
En segundo lugar, el número de bit 1
1. Comprobación cíclica de bits binarios
ideas y soluciones
Podemos realizar un bucle directamente para verificar si cada bit de un entero n dado es 1.
En el código específico, al verificar el bit ii, podemos hacer que n y 2^i realicen la operación AND, si y solo cuando el bit i de n es 1, el resultado de la operación no es 0.
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
for (int i = 0; i < 32; i++) {
if (n & (1 << i)) {
ret++;
}
}
return ret;
}
};
Análisis de Complejidad
Complejidad temporal: O(k), donde k es el número de dígitos binarios de tipo int, k=32. Necesitamos examinar cada uno de los dígitos binarios de n, para un total de 32 bits.
Complejidad espacial: O(1), solo necesitamos espacio constante para guardar varias variables.
2. Optimización de operación de bits
ideas y soluciones
Observe esta operación: n & (n−1), el resultado de la operación es exactamente el resultado de cambiar el bit más bajo de 1 en los bits binarios de n a 0.
De esta manera, podemos usar la naturaleza de esta operación de bits para acelerar nuestro proceso de verificación. En el código actual, mantenemos el AND de la n actual y la n - 1 hasta que nn se convierte en 0. Debido a que cada operación hará que se invierta el 1 en el bit más bajo de n, entonces el número de operaciones es igual al número de 1 en los bits binarios de n.
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
while (n) {
n &= n - 1;
ret++;
}
return ret;
}
};
Análisis de Complejidad
Complejidad temporal: O(logn). El número de ciclos es igual al número de 1 en los bits binarios de n y, en el peor de los casos, todos los bits binarios de n son 1. Necesitamos repetir los tiempos de inicio de sesión.
Complejidad espacial: O(1), solo necesitamos espacio constante para guardar varias variables.