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

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

目录

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

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

 3、丢失的数字

4、两整数之和

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


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

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

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


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

【位运算专题】介绍+详解5道题_第1张图片

解法一、哈希表 

【位运算专题】介绍+详解5道题_第2张图片

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;
    }
};

解法二、位图

【位运算专题】介绍+详解5道题_第3张图片

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、丢失的数字

【位运算专题】介绍+详解5道题_第4张图片

解法一、哈希表 

【位运算专题】介绍+详解5道题_第5张图片

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

 解法二、高斯求和【位运算专题】介绍+详解5道题_第6张图片

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

解法三、位运算

【位运算专题】介绍+详解5道题_第7张图片

class Solution {
public:
    int missingNumber(vector& 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、两整数之和

【位运算专题】介绍+详解5道题_第8张图片

【位运算专题】介绍+详解5道题_第9张图片

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博客


你可能感兴趣的:(【算法之路】,leetcode,算法,开发语言,c++,数据结构)