题目:
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
注意:
- 除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
解答:
解法一(HashMap遍历):
将给定数组放到HashMap中,分别设置数组元素与其出现次数为此HashMap的key与value,遍历HashMap即可得到仅出现一次的元素。
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer, Integer> numMap = new HashMap<>();
for (int i : nums) {
numMap.put(i, numMap.getOrDefault(i, -1) + 1);
}
for (Map.Entry<Integer, Integer> entry : numMap.entrySet()) {
if (entry.getValue() == 0) {
return entry.getKey();
}
}
return -1;
}
}
解法二(二进制数位和):
一个整数是由32个1或者0组成,可以将数组中所有数字的同一位置的数位相加。每一位数字与3相除,若整除则只出现一次的数字在该位为0,若余1则只出现一次的数字在该位为1。
class Solution {
public int singleNumber(int[] nums) {
int[] bitSums = new int[32];
for (int num : nums) {
for (int i = 0;i < 32;i ++) {
bitSums[i] += (num >> (31 - i)) & 1;
}
}
int result = 0;
for (int i = 0;i < 32;i ++) {
result = (result << 1) + (bitSums[i] % 3);
}
return result;
}
}
举一反三:
题目:输入一个整数数组,其中只有一个数字出现m次,其他数字都出现n次。请找出那个唯一出现m次的数字。假设m不能被n整除。
分析:可以采用和解法二相同的思路。如果数组中所有数字的第i个数位相加之和能被n整除,那么出现m次的数字第i个数位一定是0;否则出现m次的数字的第i个数位一定是1。