剑指 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];
    }
}
经验分享 程序员 微信小程序 职场和发展