剑指 Offer 56 - II. 数组中数字出现的次数 II
剑指 Offer 56 - II. 数组中数字出现的次数 II
描述
在一个数组 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
遍历统计法
思路:
因为我们的目标是找出数组中次数为1的数,其他的数都是出现3次的。因此我们遍历数组中的每一个数,统计每一个数的二进制位上是否为1,将每个次数求和余3,得到的结果就是那个出现1次的数
class Solution {
public int singleNumber(int[] nums) {
//代表所有数字各进制位1出现的次数
int[] counts = new int[32];
for(int num : nums) {
for(int j = 0; j < 32; j++) {
counts[j] += num & 1; //计算每一个位是否为1
num >>>= 1;
}
}
int res = 0, m = 3;
for(int i = 0; i < 32; i++) {
res <<= 1; //左移1位,先计算最后一位
res |= counts[31 - i] % m; //恢复第31-i位的值到res
}
return res;
}
}
hashmap统计法
思路:
定义一个HashMap<Integer, Integer>
,key存储数组中的值,value存储该值出现的次数,将所有数组元素遍历一遍,找出出现次数为1的数
class Solution {
public int singleNumber(int[] nums) {
//key为数的值,value为数出现的次数
HashMap<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
//map.entrySet()获取map的映射集合
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
return entry.getKey();
}
}
return -1;
}
}