我也遇到一个面试题 冥思苦想不出 夜不能寐 求解

2013-12-27 11:32:35 +08:00
 pagict
说在一个整型数组里,所有的数都重复了两次,仅有两个数是不重复的,如何在时间 O(n) 和空间 O(1) 内找出这两个数?

想了好久,关键是空间复杂度不符合。有种被虐的痛苦
4854 次点击
所在节点    问与答
37 条回复
duzhe0
2013-12-27 15:41:01 +08:00
我估计是题目错了, 有两个数不重复在O(n)时间和O(1)空间应该是不可能找出来的。或者说, 我们没有办法在O(n)的时间里利用O(1)的空间提取出这么大的信息量。
duzhe0
2013-12-27 15:48:32 +08:00
@Sdhjt
这个肯定不行的, 你自己随便构造一个例子试试。
duzhe0
2013-12-27 16:00:17 +08:00
@vainly 你这个至少是O(n)的空间复杂度。
Sdhjt
2013-12-27 16:05:07 +08:00
@duzhe0 例子是刚写的,已经经过我测试了,或者你可以举个例子,我放程序里测一下。
duzhe0
2013-12-27 16:07:09 +08:00
@Sdhjt 1, 1, 3, 5
duzhe0
2013-12-27 16:08:06 +08:00
@Sdhjt
或者2,2,3,5
Sdhjt
2013-12-27 16:08:32 +08:00
@duzhe0
Result : 3 5
duzhe0
2013-12-27 16:12:42 +08:00
@Sdhjt
?
难道我错了?
你试试
1, 1, 2, 2, 4, 4, 3, 5
Sdhjt
2013-12-27 16:15:39 +08:00
@duzhe0
Result : 3 5
@327beckham 的思路是对的。
stackpop
2013-12-27 16:17:22 +08:00
@duzhe0 显然可以
1^1^3^5 = 3^5 = 6 = (0110)二进制

按倒数第二位为1来分组,可以分成
第一组 1 1 5 ,1^1^5 = 5
第二组 3
故结果为5 和 3

这里的要点是,第一次抑或的结果,某一位为1,说明要找的这两个数该位值肯定不同(想想抑或的含义),而之前那些相同的两个数肯定在同一组。
==========

扩展一下到3个数只出现一次,其它都出现两次,大家再考虑下,呵呵。
2个数的比较容易想到
duzhe0
2013-12-27 16:22:10 +08:00
明白了
Virtao
2013-12-27 16:23:35 +08:00
好妙的思路,我写了篇博文,总结了一下:

http://blog.virtao.org/articles/163.html

@327beckham
@duzhe0
nagato
2013-12-27 18:05:40 +08:00
2楼答案简单明了
pagict
2013-12-27 22:30:09 +08:00
@327beckham 终于懂了……好腻害的说!谢啦
327beckham
2013-12-28 01:16:33 +08:00
@pagict 如果你和我一样是应届生或者最近在找编程类IT方面的工作的话,强烈建议你通读和精读两本书《编程之美》《剑指offer》,和July的博客。。。这些知识在方方面面会给你很大的帮助,不仅仅是面试
scola
2013-12-28 08:45:06 +08:00
@327beckham 赞,受教了
dingyaguang117
2014-01-03 19:40:01 +08:00
@327beckham 果然牛逼~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/94742

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX