本文讲解位运算的基础介绍和详解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博客