【C++】位运算算法习题


🎆个人主页:夜晚中的人海

今日语录:梦想不是空口无凭的大话,而是在寂静的奋斗里努力生长的果实!

文章目录

⭐一、判断字符是否唯一

题目链接:判断字符是否唯一

题目描述:

解题思路:

1.解法一:我们可以使用哈希表,记录当前字符出现的个数,如果大于1,则返回false,否则返回true

2.解法二:利用位图的思想 ,每一个比特位代表一个字符和一个int类型大小的字节表示所有的小写字母,比特位里面如果都为0,代表第一次出现该字符,为1,则表示该字符已经出现过

代码实现:

cpp 复制代码
class Solution {
public:
    bool isUnique(string astr) {
        if(astr.size() > 26)
            return false;
        int bitmap = 0;
        for(auto ch : astr)
        {
            int i = ch - 'a';
            //说明之前已经出现过了
            if(((bitmap >> i) & 1) == 1)
                return false;
            //把当前字符加入到位图中
            bitmap |= 1 << i;
        }
        return true;
    }
};

🏖️二、丢失的数字

题目链接:丢失的数字

题目描述:

解题思路:

1.我们设数组的大小为n,那么缺失的数据范围就在[0,n]之间

2.我们将数组中所有的数以及[0,n]之间所有的数都异或起来,根据异或运算消消乐的规则(相同的数字会被干掉),我们就可以求出那唯一一个消失的数字

代码实现:

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        int ret = 0;
        for(auto num : nums)
        {
            ret ^= num;
        }
        for(int i = 0;i <= n;i++)
        {   
            ret ^= i;
        }
        return ret;
    }
};

🏝️三、两整数之和

题目链接:两整数之和

题目描述:

解题思路:

1.我们可以使用异或运算本质:无进位加法

2.使用按位与&操作得到进位

3.不断重复上述操作直至进位为0

代码实现:

cpp 复制代码
class Solution {
public:
    int getSum(int a, int b) {
        while(b)
        {
            int x = a ^ b;
            int j = (a & b) << 1;
            a = x;
            b = j;
        }
        return a;
    }
};

🚀四、只出现一次的数字II

题目链接:只出现一次的数字II

题目描述:

解题思路:

1.解法一:可以使用哈希表,记录数字出现的个数,返回数字出现的次数恰好为一次的数字

2.解法二:使用比特位计数的思想,根据某一个比特位的值总和 % 3的结果,快速定位到该比特位的值是0还是1,然后通过每一个比特位上的值将数字进行还原

代码实现:

cpp 复制代码
class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ret = 0;
        for(int i = 0;i < 32;i++)
        {
            int sum = 0;
            for(int x : nums)
            {
                if(((x >> i) & 1) == 1)
                    sum++;
            }
            sum %= 3;
            if(sum == 1)
                ret |= 1 << i;
        }
        return ret;
    }
};

🎄五、消失的两个数字

题目链接:消失的两个数字

题目描述:

解题思路:

1.由题我们可知:假设数组大小为n,则数据范围在[1,n + 2]之间

2.将所有的数都异或在一起,得到两个数

3.找出两个数比特位不同的那一位进行区分

4.因此将数字划分为两类进行异或,最终得到结果

代码实现:

cpp 复制代码
class Solution {
public:
    vector<int> missingTwo(vector<int>& nums) {
        int n = nums.size() + 2;
        int tmp = 0;
        for(auto x :nums)
        {
            tmp ^= x;
        }
        for(int i = 1;i <= n;i++)
        {
            tmp ^= i;
        }
        int diff = 0;
        //区分最后一位是1还是0
        while(1)
        {
            if(((tmp >> diff) & 1) == 1)
                break;
            else
                diff++;
        }
        int x1 = 0,x2 = 0;
        for(auto x : nums)
        {
            if(((x >> diff) & 1) == 1)
            {
                x1 ^= x;
            }
            else
            {
                x2 ^= x;
            }
        }
        for(int i = 1;i <= n;i++)
        {
            if(((i >> diff) & 1) == 1)
            {
                x1 ^= i;
            }
            else
            {
                x2 ^= i;
            }
        }
        return {x1,x2};
    }
};
相关推荐
邪修king27 分钟前
UE5 进阶篇第一弹:中期架构升级 —— 组件化开发与 Gameplay 框架实战
c++·游戏·架构·ue5
zhangfeng11331 小时前
openclaw skills 小龙虾技能 通讯仿真 matlab skill Simulink Agentic Toolkit,通过kimi找到,mcp通讯
开发语言·matlab·openclaw·通讯仿真
小O的算法实验室2 小时前
2025年IEEE TETCI,异构无人机取送货问题中的转运优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
chao1898448 小时前
基于 SPEA2 的多目标优化算法 MATLAB 实现
开发语言·算法·matlab
沪漂阿龙8 小时前
AI大模型面试题:支持向量机是什么?间隔最大化、软间隔、核函数、LinearSVC 全面拆解
人工智能·算法·支持向量机
赏金术士8 小时前
Kotlin 习题集 · 高级篇
android·开发语言·kotlin
little~钰9 小时前
倍增算法和ST表
算法
楼兰公子9 小时前
buildroot 在编译rust时裁剪平台类型数量的方法
开发语言·后端·rust
知识领航员10 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
薛定e的猫咪10 小时前
因果推理研究方向综述笔记
人工智能·笔记·深度学习·算法