136. 只出现一次的数字

243 阅读1分钟

方法一:用hashmap

扫一遍,记录每个元素出现的次数,再扫一遍,拿出value=1的key。

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            if (!map.containsKey(num)) {
                map.put(num, 1);
            } else {
                map.put(num, map.get(num) + 1);
            }
        }
        
        for (int k : map.keySet()) {
            if (map.get(k) == 1) {
                return k;
            }
        }
        return 0;
    }
}

方法二:位运算

  • 任何数和0做异或运算,结果仍然是原来的数,即 a⊕0 = a
  • 任何数和其自身做异或运算,结果是0, 即a⊕a = 0
  • 异或运算满足交换律和结合律, a⊕b⊕a = b⊕a⊕a = b⊕(a⊕a) = b⊕0 = b 扫一遍,把每个数都异或一下,最终结果就是只出现过一次的数字。
class Solution {
    public int singleNumber(int[] nums) {
        int res = 0;
        for (int num : nums) {
            res = res ^ num; //异或符号^
        }
        return res;
    }
}