JZ56 - II. 数组中数字出现的次数 II(位运算)

80 阅读1分钟

leetcode.cn/problems/sh…

在一个数组 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

解法一:

不排序,使用双重 for 循环进行查找,使用 HashMap 记录出现次数。

class Solution {
    public int singleNumber(int[] nums) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int num : nums) {
            if (hashMap.containsKey(num)) {
                hashMap.put(num, hashMap.get(num) + 1);
            } else {
                hashMap.put(num, 1);
            }
        }
        for (Map.Entry<Integer, Integer> integerIntegerEntry : hashMap.entrySet()) {
            if (integerIntegerEntry.getValue() == 1) {
                return integerIntegerEntry.getKey();
            }
        }
        return 0;
    }
}

解法二:

先排序,再用 for 循环查找,如果当前元素和后两个元素不相同,则当前元素就是要找的数字,如果遍历到最后一个元素,则该元素为所求。注意遍历时是 i = i + 3。

class Solution {
    public int singleNumber(int[] nums) {
        if (nums.length == 1) {
            return nums[0];
        }
        int result = nums[0];
        Arrays.sort(nums);
        for (int i = 0; i < nums.length; i += 3) {
            if (i == nums.length - 1 || nums[i] != nums[i + 2]) {
                result = nums[i];
                break;
            }
        }
        return result;
    }
}