【位运算专题】介绍+详解5道题

发布时间:2024年01月23日

本文讲解位运算的基础介绍和详解6道题,在讲解题目的同时提供AC代码【注:点击题目可打开对应链接】

1、位运算的基础介绍【重点】

如果上面位图不了解的,可以看我之前写过的文章:

【C++和数据结构】位图和布隆过滤器-CSDN博客?


?2、面试题 01.01. 判定字符是否唯一

解法一、哈希表?

class Solution {
public:
    bool isUnique(string astr) {
       int hash[26] = { 0 };
       for (auto ch : astr)
       {
           //判断该字符之前是否存在过
           if (hash[ch - 'a'] != 0) return false;
           //将该字符放入到哈希表中
           hash[ch - 'a']++;
       }
       return true;
    }
};

解法二、位图

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;//把第i个位置变为1
        }
        return true;
    }
};

?3、丢失的数字

解法一、哈希表?

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size();
        vector<int> hash(n + 1);
        for (auto x : nums) hash[x]++;//出现了就++
        for (int i = 0; i <= n; i++)
            if (hash[i] != 1) return i;//返回这个缺失的数
        
        return -1;
    }
};

?解法二、高斯求和

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ret = 0;
        for (int i = 0; i <= nums.size(); i++) ret += i;//求0~n所有数组的和
        for (auto x : nums) ret -= x;//减去当前数组中所有数字
        return ret;
    }
};

解法三、位运算

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ret = 0;
        for (auto x : nums) ret ^= x;//将数组中的数^一遍
        for (int i = 0; i <= nums.size(); i++) ret ^= i;//将0~n的数^一遍
        return ret;
    }
};

4、两整数之和

class Solution {
public:
    int getSum(int a, int b) {
       while (b)
       {
            int x = a ^ b;
            int carry = (a & b) << 1;//计算进位
            a = x;
            b = carry;
       }
       return a;
    }
};

5、只出现一次的数字的三个版本?

剩余三道题之前详细讲过【打开链接即可】

【c++】只出现一次的数字I II III(三个版本:三道题)_出现一次的数字c++-CSDN博客


文章来源:https://blog.csdn.net/m0_74044018/article/details/135762387
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。