2021/4/6,题意如下:
和之前不一样的是把出现两次改成了出现三次,一开始有两种思路,一种就是空间复杂度O(N)的用map标记一下,一种就是时间复杂度O(NlgN)的排序然后找。看了K神的题解发现了位运算的方法确实牛,就是把每一位出现的次数记下来,然后取余3就是只剩下出现一次的数了。
c++参考代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int> ans(32);
for(int i=0;i<nums.size();i++)
{
for(int j=0;j<32;j++)
{
ans[j]+=nums[i]&1;
nums[i]>>=1;
}
}
int num=0;
for(int i=31;i>=0;i--)
{
num<<=1;
num|=ans[i]%3;
}
return num;
}
};
时间复杂度:O(N),空间复杂度:O(1)。
参考资料
·依旧是K神的题解