首先是题目描述 就是在一个数组中找到一个只出现了一次的元素
示例:
首先要了解题目要求 简单的来说就是要求时间复杂度为O(N) 空间复杂度为O(1)
解题思路:在初学c++的基础上我们可以使用位与运算符(&)和位或运算符(|)来解决这道题
类似于一个哈希表的思路 将其展开成32位的 与1<<i进行位与操作 如果一个数出现三次的话 那么他的arr【i】就一定是3n 而如果只出现一次的那个数也在其中的话 那么arr【i】就会是3n+1
之后我们就要找到这个3n+1的元素 用0和1<<i进行或运算 此时的话 我们就可以找出这个只出现一次的元素了
下面是画图板展示:
完整代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int arr[32]={0};
for(auto val:nums)
{
for(size_t i=0;i<32;i++)
{
if(val&(1<<i))
{
arr[i]++;
}
}
}
int num=0;
for(size_t i=0;i<32;i++)
{
if((arr[i]%3)!=0)
{
num|=(1<<i);
}
}
return num;
}
};
暂存疑问的点:如果把
if(val&(1<<i))
{
arr[i]++;
}
这一段改成val&=(1<<i)
if(val) arr[i]++;是不行的
2023-3-6编辑