题目描述
给你一个整数数组 nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
样例1
输入:nums = [2,2,3,2]
输出:3
样例2
输入:nums = [0,1,0,1,0,1,99]
输出:99
提示
1 <= nums.length <= 3 * 10^4
-2^31 <= nums[i] <= 2^31 - 1
nums
中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
算法1
(位运算)
- 依次考虑二进制的每一位:由于其他的数都是恰好出现3次,所以这个数的某一位无论是
0
还是1
都恰好出现3次 -
我们把数组中所有的数对于某一位二进制位进行求和,然后
mod 3
的余数就是恰好出现一次的数的那一位。如果恰好出现一次的数某一位为1
,可以通过|
运算来还原出那一位,答案只需要扫描32
位二进制位即可 -
时间复杂度:$O(32 \times n)$
Java 代码
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i = 0; i < 32; i++){
int cnt = 0;
for(int x: nums){
cnt += (x >> i) & 1;
}
if(cnt % 3 != 0) res |= (1 << i);
}
return res;
}
}