专题五_位运算(1)

目录

解析

136. 只出现一次的数字

题解

260. 只出现一次的数字 III

题解

191. 位1的个数

题解

338. 比特位计数

题解

461. 汉明距离

题解


解析

136. 只出现一次的数字

136. 只出现一次的数字 - 力扣(LeetCode) 

题解

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        // 34.专题五_位运算_常见位运算总结(包含5道算法题)1
        int ret = 0;
        for (int x : nums) ret ^= x;
        return ret;
    }
};

 

260. 只出现一次的数字 III

260. 只出现一次的数字 III - 力扣(LeetCode)

题解

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        // 34.专题五_位运算_常见位运算总结(包含5道算法题)2
        int xorsum = 0;
        for (int x : nums) xorsum ^= x;
        // 防止溢出
        int right_one = (xorsum == INT_MIN ? xorsum : xorsum & (-xorsum)); // 取到最右边的一个1,用于将数组分为两类
        int type1 = 0, type2 = 0;
        for (int x : nums)
        {
            if (x & right_one) // 一类该bit位为1,另一类为0
                type1 ^= x;
            else
                type2 ^= x;
        }
        return {type1, type2};
    }
};

191. 位1的个数

191. 位1的个数 - 力扣(LeetCode)

题解

class Solution {
public:
    int hammingWeight(int n) {
        // 34.专题五_位运算_常见位运算总结(包含5道算法题)3
        int ret = 0;
        while (n)
        {
            if (n & 1) ret++;
            n >>= 1;
        }
        return ret;
    }
};

338. 比特位计数

338. 比特位计数 - 力扣(LeetCode)

  

题解

class Solution {
public:
    int hammingWeight(int n) {
        // 34.专题五_位运算_常见位运算总结(包含5道算法题)3
        int ret = 0;
        while (n)
        {
            if (n & 1) ret++;
            n >>= 1;
        }
        return ret;
    }
    vector<int> countBits(int n) {
        // 34.专题五_位运算_常见位运算总结(包含5道算法题)4
        vector<int> ret;
        for (int i = 0; i <= n; ++i)
            ret.push_back(hammingWeight(i));
        return ret;
    }
};

461. 汉明距离

461. 汉明距离 - 力扣(LeetCode)

 

题解

class Solution {
public:
    int hammingDistance(int x, int y) {
        // 34.专题五_位运算_常见位运算总结(包含5道算法题)5
        int sox = x ^ y, ret = 0;
        while (sox)
        {
            ret += sox & 1;
            sox >>= 1;
        }
        return ret;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风玉骨

爱了!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值