难度中等411
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1限制:
1 <= nums.length <= 100001 <= nums[i] < 2^31
解题方法:
这道题同样是使用位运算,但是与之前不同的是,这道题其它的数字出现了奇数次,那么我们单单是都异或一遍的话是求不出来只出现一次的数字的!
这道题还是通过比特位来切入,因为其它数字都出现了三次,那么我们可以用一个数组来记录这个数字的某个比特位为1的位置,那么肯定比特位为 1 的位置是 3 的倍数,不可能会出现说是 4 或者 5 的倍数等等,也就是只能被 3 取模余 0,那么剩下的那些比特位为 1 的位置且模 3 后不为 0 的,肯定是只出现了一次的数字,那么我们就能通过这些位置来拼出这个数字!
class Solution {
public:
int singleNumber(vector<int>& nums) {
int hash[32] = {0};
for(int i = 0; i < nums.size(); ++i)
{
for(int j = 0; j < 32; ++j)
{
if((nums[i] >> j) & 1)
hash[j]++;
}
}
int sum = 0;
for(int i = 0; i < 32; ++i)
{
if(hash[i] % 3 != 0)
sum += pow(2, i);
}
return sum;
}
};