Notas de cepillado de Leetcode (C++) - operación de bits

Notas de cepillado de Leetcode (C++) - operación de bits

Ordene las ideas en el proceso de repasar las preguntas, resúmalas y compártalas aquí.
dirección de github: https://github.com/lvjian0706/Leetcode-solutions
El proyecto de github se creó recientemente, y el código y las ideas se cargarán uno tras otro. El código está basado en C++ y python. Al mismo tiempo, el algoritmo de clasificación básico también se clasificará y cargará.

136. Números que ocurren una sola vez

Dada una matriz de enteros no vacía, cada elemento aparece dos veces, excepto cierto elemento que aparece solo una vez. Encuentra el elemento que aparece solo una vez.

Explicación:
su algoritmo debe tener una complejidad de tiempo lineal. ¿Puedes hacerlo sin usar espacio extra?

Ejemplo 1:
Entrada: [2,2,1]
Salida: 1
Ejemplo 2:
Entrada: [4,1,2,1,2]
Salida: 4

class Solution {
    
    
public:
    /*
    由于时间和空间限制,所以使用二进制的异或运算解答即可;
    */
    int singleNumber(vector<int>& nums) {
    
    
        int ans = nums[0];
        for(int i=1; i<nums.size(); i++){
    
    
            ans ^= nums[i];
        }
        return ans;
    }
};

191. El número de bit 1

Escriba una función que tome un entero sin signo como entrada y devuelva el número de dígitos '1' en su representación binaria (también conocido como el peso de Hamming).

Ejemplo 1:
Entrada: 000000000000000000000000000001011
Salida: 3
Explicación: En la cadena binaria de entrada 0000000000000000000000000001011, un total de tres bits son '1'.
Ejemplo 2:
Entrada: 000000000000000000000000010000000
Salida: 1
Explicación: En la cadena binaria de entrada 00000000000000000000000010000000, un total de un bit es '1'.
Ejemplo 3:
Entrada: 1111111111111111111111111111101
Salida: 31
Explicación: En la cadena binaria de entrada 111111111111111111111111111101, un total de 31 bits son '1'.

方法1class Solution {
    
    
public:
    /*
    返回二进制表达式中数字位数为 ‘1’ 的个数:
    求二进制数(对2取余后整除2),当该位为1时,ans++;
    */
    int hammingWeight(uint32_t n) {
    
    
        int ans = 0;
        while(n!=0){
    
    
            ans += (n % 2);
            n /= 2;
        }
        return ans;
    }
};

方法2class Solution {
    
    
public:
    /*
    返回二进制表达式中数字位数为 ‘1’ 的个数:
    n = n & (n-1) : 将最后一个1置0;
    将最后一个1循环置0,直到所有位上都是0;
    */
    int hammingWeight(uint32_t n) {
    
    
        int ans = 0;
        while(n){
    
    
            n = n & (n-1);
            ans++;
        }
        return ans;
    }
};

260. El número III que ocurre una sola vez

Dada una matriz de números enteros, exactamente dos elementos aparecen solo una vez y todos los demás elementos aparecen dos veces. Encuentra esos dos elementos que aparecen solo una vez.

Ejemplo:
Entrada: [1,2,1,3,2,5]
Salida: [3,5]

class Solution {
    
    
public:
    /*
    找出只出现一次的那两个元素:因为是常数空间,考虑位运算:
    x & (-x) :保留位中最右边1,且将其余的1设为0。 
    1. xy ^= nums[i]:先找到只出现过一次的两个数的异或结果;
    2. dif = xy & (-xy):找出x与y不同的一位(最右边一位);
    3. x ^= nums[i]:找到x;
    4. xy^x:找到y;
    */
    vector<int> singleNumber(vector<int>& nums) {
    
    
        vector<int> ans;
        int xy=0;
        for(int i=0; i<nums.size(); i++){
    
    
            xy ^= nums[i];
        }
        int dif = xy & (-xy);
        int x = 0;
        for(int i=0; i<nums.size(); i++){
    
    
            if(nums[i]&dif){
    
    
                x ^= nums[i];
            }
        }
        ans.push_back(x);
        ans.push_back(xy^x);
        return ans;
    }
};

338. Contando bits

Dado un número entero no negativo. Para cada número i en el rango 0 ≤ i ≤ num, cuente el número de 1 en su dígito binario y devuélvalos como una matriz.

Ejemplo 1:
Entrada: 2
Salida: [0,1,1]
Ejemplo 2:
Entrada: 5
Salida: [0,1,1,2,1,2]

class Solution {
    
    
public:
    /*
    对于0≤i≤num范围中的每个数字i,计算其二进制数中的1的数目并将它们作为数组返回:动态规划问题
    1. 奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。
    2. 偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。
    */
    vector<int> countBits(int num) {
    
    
        vector<int> dp(num+1);
        dp[0] = 0;
        for(int i=1; i<num+1; i++){
    
    
            if(i%2==0){
    
    
                dp[i] = dp[i/2];
            }
            else{
    
    
                dp[i] = dp[i-1] + 1;
            }
        }
        return dp;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43273742/article/details/107740748
Recomendado
Clasificación