1. 题目
在一个数组 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
👍 184 👎 0
2. 题解
2.1 解法1: 哈希表
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
}
Set<Map.Entry<Integer, Integer>> entrySet = map.entrySet();
for (Map.Entry<Integer, Integer> entry : entrySet) {
if (entry.getValue() == 1) {
return entry.getKey();
}
}
return 0;
}
}
2.2 解法2: 位运算
- 由于其他数字出现三次, 所以其和能被 3 整除, 同理其每位二进制位的和也能被3整除
- 统计数组中每位二进制数字的和, 若能被3整除, 说明出现一次数字的那一位为 0, 否则为1
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
for (int i = 0; i < 32; i++) {
// 用于统计每位 1 出现的个数
int cnt = 0;
for (int j = 0; j < nums.length; j++) {
int div = 1 << i;
if ((nums[j] & div) != 0) {
cnt++;
}
}
// 如果不能被3整除, 说明该位为1, 否则为0 ,可以不做处理
if (cnt % 3 == 1) {
ans ^= (1 << i);
}
}
return ans;
}
}