剑指 Offer 56 - II. 数组中数字出现的次数 II
题目链接:
【方法一 哈希表】
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> set = new HashMap();
for(var i: nums){
set.put(i, set.getOrDefault(i, 0) + 1);
}
for(var entry: set.entrySet()){
if(entry.getValue() == 1) return entry.getKey();
}
return 0;
}
}
【方法二 统计】统计每一位的1个数,然后取余3,然后把剩下的1的位拼接起来就是答案了。
class Solution {
public int singleNumber(int[] nums) {
int[] cnt = new int[32];
for(var i: nums){
var j = 0;
while(i > 0){
cnt[j++] += i & 1;
i >>>= 1;
}
}
int ans = 0;
for(var i = 31; i >= 0; i--){
ans <<= 1;
ans += cnt[i] % 3;
}
return ans;
}
}
【方法三 排序】
class Solution {
public int singleNumber(int[] nums) {
Arrays.sort(nums);
int n = nums.length - 2;
for(var i = 0; i < n; i += 3){
if(nums[i] == nums[i + 1] && nums[i] == nums[i + 2]) continue;
if(nums[i] == nums[i + 1]) return nums[i + 2];
if(nums[i] == nums[i + 2]) return nums[i + 1];
if(nums[i + 1] == nums[i + 2]) return nums[i];
}
return nums[n + 1];
}
}
上一篇:
IDEA上Java项目控制台中文乱码
