题目链接
137. 只出现一次的数字 II - 力扣(LeetCode)
题目解析
只有一个元素出现了一次,其他的元素出现了三次, 返回出现一次的元素
算法原理
所有数的任意一个比特位, 会出现以下四种情况
所有位都进行这么操作: 我们把这一位所有的都加起来,然后%3,此时得出来的就是我们要的那个数的每一位
拓展: 一个数出现了0次,其他的数出现了n次
直接%n即可
代码编写
法1: 哈希表
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer, Integer> map = new HashMap<>();
// 把元素放进hash表里面
for (int x : nums) {
map.put(x, map.getOrDefault(x, 0) + 1);
}
// 查询次数为1的数
int ret = 0;
for (int x : nums) {
if (map.get(x) == 1) {
ret = x;
break;
}
}
return ret;
}
}
法2: 位运算
class Solution {
public int singleNumber(int[] nums) {
// 使用比特位
int ret = 0;
// 修改每一位,并且进行%3,如果某一位是0,那么就是0->为一个出现的数
// 如果是1,那么就是1
// 循环每一个比特位
for (int i = 0; i < 32; i++) {
// 计算第i位的和
int sum = 0;
for (int x : nums) {
// 把第i为所有的1进行相加
if (((x >> i) & 1) == 1) {
sum++;
}
}
// 计算每一位
if ((sum % 3) == 1) {
// 把那一位修改成1
ret = ret | (1 << i);
}
// 为0就不需要修改
}
return ret;
}
}