LeetCode 哈希表 136:只出现一次的数字(计数哈希表,异或)

 

先说使用额外空间实现的常规解法:

判断只出现一次,自然的想到哈希表

思路是:建立一个形式为num-count的hashmap。遍历数组,如果map.get(num)为null则对应count记为1,如果不为null则次数加一

之后遍历hashmap,取出count等于1的key。

注意hashmap不能放基本类型,而是放Interger

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (Integer i : nums) {
            Integer count = map.get(i);
            count = count == null ? 1 : ++count;
            map.put(i, count); //这个有直接覆盖的效果
        }
        for (Integer i : map.keySet()) {
            Integer count = map.get(i);
            if (count == 1) {
                return i;
            }
        }
        return -1; // can't find it.
    }
}

Time: O(n) Space: O(n)

 

不使用额外空间,一开始完全无想法,这里学习到了一种新的方法:异或操作

 

 这个性质也太巧妙了,可谓就是为这道题准备的。。。

一路异或过去,又满足结合律和交换律,其余成对异或出来都是0,一堆0互相异或也是0,只剩落单的数和0一异或就成了本身。

class Solution {
    public int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums) {
            single ^= num;
        }
        return single;
    }
}

 

posted @ 2020-06-19 15:51  将来的事  阅读(288)  评论(0)    收藏  举报