一道面试题,已到锅里,

crazy_kou 2014-11-17 05:15:10
昨日面试,有这样一道面试题:一个数组存放数字,无限大,数字不重复,乱序,求解数组中没有的数字。
我说的不是很明了,举例:int[] nums = {3,5,1,2,6,7} ; 这样的一个数组,没有4,考虑数组无限大,问如何高效的找出?

我先说说我当时的回答:先排序Arrays.sort(); 再折半比较数组长度的一半middle和nums[middle],如果相等说明前一半不缺数字,而后在折半比较后一半数,递归查找。不等则在前一半折半比较。

当时觉得自己的答得不错,后来回去在车上想到更简单的一种,不需要先排好序,quickSort有一步,需要找出一个数,然后将大于此数的放它前面,小于的放它后面。返回此数的坐标,这样我们无需整体排序,每次比较此数坐标和数组值,就可确定缺失的数的范围,而后递归直至找出。

只有一个数的比较容易,但如果缺失的数字较多,该如何高效的查找呢?比如少两个,三个数,众人拾柴火焰高,拭目以待。
...全文
680 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
meng020712 2014-11-20
  • 打赏
  • 举报
回复
数学题、 你知道怎么用数学做出来、就知道怎么用代码写出来了‘。。 你先用数学方法、解题、基本上就知道了
猿人林克 2014-11-18
  • 打赏
  • 举报
回复
引用 10 楼 sum_rain 的回复:
如果只缺少一个的话,求和1+2+...+N在减去数组所有数之和。难道面试官考脑经急转弯?
骚年, 楼主的意思是 1 2 3 500 那就是缺4 到 499这些数。。 无长度限制的数组,太大了相加不久溢出了 我觉得就是快速排序的思路比较好
crazy_kou 2014-11-18
  • 打赏
  • 举报
回复
引用 10 楼 sum_rain 的回复:
如果只缺少一个的话,求和1+2+...+N在减去数组所有数之和。难道面试官考脑经急转弯?
由于无穷大问题,到时肯定相加会超出一般数据的存储范畴。
crazy_kou 2014-11-18
  • 打赏
  • 举报
回复
引用 8 楼 luo3380 的回复:
我两年前面试的时候遇到这题目 简单来说查找在一堆无重复自然数集合中找到最小未出现的数。 应该是利用快速排序的思想,选中一个数进行一遍快排,再比较这个数的数值和此时在数组中的坐标,判断是否相等决定出现在左侧还是右侧,并重复迭代。 也就是你说的第二种方法。 之所以强调无穷大 是因为避免出现空间换时间的思维方式。 我们那个时候 班里很多人都要构造一个特别大的位图,遍历一遍填充,再遍历一些找到第一个未填充的点就行了。 好像不记得班上谁想出了其他的方法
赞个
AceShot 2014-11-18
  • 打赏
  • 举报
回复
如果只缺少一个的话,求和1+2+...+N在减去数组所有数之和。难道面试官考脑经急转弯?
fireofsun 2014-11-18
  • 打赏
  • 举报
回复
我觉得就是那个“无限大”有点坑,这还叫人怎么排。8楼说的好像很有道理,快排挺适合这里的,需要的空间不大,下标就能说明前面有没空位。
luo3380 2014-11-18
  • 打赏
  • 举报
回复
我两年前面试的时候遇到这题目 简单来说查找在一堆无重复自然数集合中找到最小未出现的数。 应该是利用快速排序的思想,选中一个数进行一遍快排,再比较这个数的数值和此时在数组中的坐标,判断是否相等决定出现在左侧还是右侧,并重复迭代。 也就是你说的第二种方法。 之所以强调无穷大 是因为避免出现空间换时间的思维方式。 我们那个时候 班里很多人都要构造一个特别大的位图,遍历一遍填充,再遍历一些找到第一个未填充的点就行了。 好像不记得班上谁想出了其他的方法
u013886110 2014-11-18
  • 打赏
  • 举报
回复
我觉得你这样做是可行的,先排序后拆半查找。
u010502580 2014-11-18
  • 打赏
  • 举报
回复
表示看不懂 算法最头疼
crazy_kou 2014-11-18
  • 打赏
  • 举报
回复
引用 4 楼 Inhibitory 的回复:
int[] nums = {3,5,1,2,6,7000},这种情况是哪个数字没呢? 我觉得题目没有描述清楚
缺失的是7到6999.
Inhibitory 2014-11-17
  • 打赏
  • 举报
回复
int[] nums = {3,5,1,2,6,7000},这种情况是哪个数字没呢? 我觉得题目没有描述清楚
普凡 2014-11-17
  • 打赏
  • 举报
回复
如果是数组长度特别大先排序也比较耗时,可以先拆分,分别对对每块进行查找(此时也可排序),最后在进行归并运算,这样可以充分利用内存,用空间换时间的做法。
wyc_ 2014-11-17
  • 打赏
  • 举报
回复
无限大说的不准确吧,无限大怎么存放,怎么在有限的时间内排序呢
wxdawxq 2014-11-17
  • 打赏
  • 举报
回复
先排序, 其他就简单了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧