题目
在一个数组 nums
中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1
限制:
1 <= nums.length <= 10000
1 <= nums[i] < 2^31
解题思路
如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。如果某一位的和能被3整除,说明目标数字在二进制表示中当前位上是0;如果不能被3整除,说明目标数字在二进制表示中当前位上为1。
复杂度分析:
时间复杂度:O(N)。
空间复杂度:O(1)。
代码
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i=0; i<32; i++){
int count = 0;
for(int num : nums){
// 统计当前位置为1的数字的数量
if((num & (1<<i)) != 0){
count++;
}
}
if(count%3 != 0){
res += (1<<i);
}
}
return res;
}
}