zoukankan      html  css  js  c++  java
  • LeetCode Q136 Single Number(Medium)

    Given an array of integers, every element appears twice except for one. Find that single one.

    翻译

    给定一个整型数组,除了其中一个元素出现一次,其他每个元素都出现两次。找出出现一次的元素。

    分析

    解法一:

      第一反应就是排序并遍历所有元素,计算每个元素出现的次数,然后输出只出现一次的元素,这样的时间复杂度为 O(log2n) ,空间复杂度为 O(N) 。时间复杂度已经十分理想,但是空间复杂度不稳定,如果数据为 100M、1G ,甚至 10G 的,那么空间申请也严重影响了效率,并且内存条岂不是爆炸了!?现在的问题是解决空间复杂度的问题。

    解法二:

      哪么那些数据可以提前删除呢?解法一中,如果一个元素出现两次,那这个元素就不是要找的元素,就可以删除统计它们出现次数元素。根据这一点,可以使用哈希表,遍历元素时,如果这个元素出现两次,就在哈希表中删除这个元素。时间复杂度为 O(n) ,空间复杂度最好为 O(1),最差为O(n / 2 + 1)。

    解法三:

      异或的使用

     A ⊕ A = 0 

     交换律:A ⊕ B = B ⊕ A  

     结合律:A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C 

      可以看出当有两个相同的数异或时,变为 0 。

      说到这里,大家应该都想到了方法,把所有数都异或一次,除了只出现一次的元素就会留下。

      算法就很简单,读入加异或,便得出答案。

    1 int n=0;
    2 n = int.Parse(Console.ReadLine());
    3 int ans=0;
    4 for (int i=0;i<n;i++)
    5     a ^ = int.Parse(Console.ReadLine());
    6 Console.WriteLine(a.ToString());

     

  • 相关阅读:
    第42天:焦点图
    第41天:匀速、缓动运动和图片无缝滚动
    第40天:字符串操作:截取字符串
    MyBatis一级缓存(转载)
    Mycat 做简单的读写分离(转载)
    ui设计的好网站(转载)
    Java面试常问的问题(转载)
    ios学习的博客地址
    策略模式
    dubbo框架的简单介绍
  • 原文地址:https://www.cnblogs.com/Bita/p/5314496.html
Copyright © 2011-2022 走看看