给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
示例 1:
输入:nums = [2,2,3,2]
输出:3
示例 2:输入:nums = [0,1,0,1,0,1,99]
输出:99
提示:
1 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
1哈希表
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i : nums){
if (map.containsKey(i)){
map.put(i,map.get(i) + 1);
}else{
map.put(i,1);
}
}
for (int i : map.keySet()){
if (map.get(i)== 1){
return i;
}
}
return 0;
}
}
2依次决定每一个二进制
对于数组中的每一个元素 ,使用位运算(x >> i) & 1 得到元素的第 i 个二进制位,并将它们相加再对 3 取余,即为答案的第 i个二进制位。
class Solution {
public int singleNumber(int[] nums) {
int ans = 0;
for (int i = 0;i < 32;i++){
int total = 0;
for (int num : nums){
total += (num >> i) & 1;//得到num的二进制值的第i位
}
if (total % 3 != 0){//只出现一次的数的二进制值第i位上的数为1
ans |= (1 << i);//放到ans的第i位
}
}
return ans;
}
}