El decimotercer día de preguntas de cepillado de algoritmos: operación de bit--1

 

Tabla de contenido

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

Análisis de Complejidad

2. Optimización de operación de bits

ideas y soluciones

Análisis de Complejidad

Uno, una potencia de 2

231. Poder de dos: LeetCode https://leetcode.cn/problems/power-of-two/?plan=algorithms&plan_progress=gzwnnxs

Mira la solución:

Poder de 2 - Poder de 2 - LeetCode https://leetcode.cn/problems/power-of-two/solution/2de-mi-by-leetcode-solution-rny3/

En segundo lugar, el número de bit 1

191. Número de 1 bits - LeetCode https://leetcode.cn/problems/number-of-1-bits/?plan=algorithms&plan_progress=gzwnnxs

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.

Supongo que te gusta

Origin blog.csdn.net/m0_63309778/article/details/126755481
Recomendado
Clasificación