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;
        }
    }
  • 相关阅读:
    Vmware虚拟机的单用户模式
    Xshell密钥认证
    PuTTY密钥认证
    CentOS 7在NAT模式下配置静态IP
    使用OllyDbg破解EasyCrackMe
    2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建
    2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建
    Kafka常用命令
    选择器和层叠
    语义化
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13163447.html
Copyright © 2011-2022 走看看