剑指 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项目控制台中文乱码