算法:找出正确的整数

题目:一个无序数组里有99个不重复正整数,范围从1到100,唯独缺少一个整数。如何找出这个缺失的整数?

解法一:
创建一个HashMap,以1到100为键,值都是0.然后遍历整个数组,每读到一个整数,就找到HashMap当中对应的键,让其加一。
由于数组中缺少一个整数,最终一定有99个键对应的值等于1,剩下一个键对应的值等于0。遍历修改后的HashMap,找到这个值为0的键。

假设数组长度是N,那么该解法的时间复杂度是O(1),控件复杂度是O(N)。

解法二:
先把数组元素进行排序,然后遍历数组,检查任意两个相邻元素数值是否连续。如果不连续,则中间缺少的的整数就是所要寻找的;如果全部连续,则缺少的整数不是1就是100.

假设数组长度是N,时间复杂度为O(N*LogN)(排序算法),空间复杂度是O(1)。

解法三:
很简单也很高效地方法,先算出1+2+3...+100的和,然后依次减去数组里的元素,最后得到的差,就是唯一缺失的整数。

假设数组长度是N,那么该解法的时间复杂度是O(N),空间复杂度为O(1)。


题目扩展:

题目:一个无序数组里有若干个正整数,范围从1到100,其中99个整数都出现了偶数次,只有一个整数出现了奇数次(比如1,2,2,3,3,4,5,5),如何找到这个出现奇数次的整数?

解法:遍历整个数组,依次做异或在位运算时相同为0,不同为1,因此所有出现偶数次的整数都会相互抵消变成0,只有唯一出现奇数次的整数会被留下。
假设数组长度是N,那么该解法的时间复杂度是O(N),空间复杂度是O(1)。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HashMap 是 Java 面试必考的知识点,面试官从这个小知识点就可以了解我们对 Java 基础的掌握程度。网...
    野狗子嗷嗷嗷阅读 11,674评论 9 107
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,353评论 0 33
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,817评论 0 17
  • “后来想,凡有一人的主张,得了赞和,是促其前进的,得了反对,是促其奋斗的,独有叫喊于生人中,而生人并无反应,既非赞...
    cc4145e512c7阅读 1,404评论 0 0
  • 克服写作障碍之前你要清楚自己到底掉在了哪些坑!找到问题症结对症下药! 九种常见的写作障碍类型: 1.不知道写什么?...
    肖沐歌阅读 1,755评论 1 2