解题思路
剑指 Offer 56 - II. 数组中数字出现的次数 II
- 哈希表:把所有数字及其出现的次数存入哈希表,然后遍历哈希表找到次数为1的数字
- 位运算:统计数字中的各个位中1出现的次数,当为3n 次时,只出现一次的数字的对应位应当为0,当为3n + 1次时,只出现一次的数字的对应位应当为1。
代码
方法一:哈希表
import java.util.Map.Entry;
class Solution {
//方法一:哈希表:把所有数字及其出现的次数存入哈希表,然后遍历哈希表找到次数为1的数字
public static int singleNumber(int[] nums) {
Map<Integer , Integer> map = new HashMap<>();
for (int i : nums) {
map.put(i, map.getOrDefault(i,0)+1);
}
for(Entry<Integer , Integer> entry : map.entrySet()) {
if(entry.getValue() == 1) {
return entry.getKey();
}
}
return 0;
}
}
方法二:位运算
class Solution {
//方法二:位运算:统计数字中的各个位中1出现的次数,当为3n 次时,只出现一次的数字的对应位应当为0,当为3n + 1次时,只出现一次的数字的对应位应当为1。
public static int singleNumber(int[] nums) {
int result = 0;
for(int i=0 ; i<32 ; i++) {
//统计该位1的出现次数情况
int count = 0;
int index = 1<<i;
for(int j : nums) {
//该位与操作后的结果不为0,则表示该位为1的情况出现了
if((j & index)!=0) {
count++;
}
}
//该位上出现1的次数mod3后为1(即出现了3n+1次),表示出现一次的数字该位为1
if(count % 3 ==1) {
result |= index;
}
}
return result;
}
}