zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    Codeforces #364 DIV2
    uva10635 LIS
    hdu3714 三分找最值
    【转】三分查找
    NBUT 1457 莫队算法 离散化
    HYSBZ 2038 莫队算法
    莫队算法
    poj3417 LCA + 树形dp
    hdu3087 LCA + 暴力
    hdu2874 LCA在线算法
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13163447.html
Copyright © 2011-2022 走看看