找出最大连续自然数个数

搜集者:江南烟雨

E-Mail:xiajunhust@gmail.com

本题为网易互联网暑期实习生笔试算法题。

凭记忆记录下来的题目,如违反网易版权请邮件联系,本人会删除。

以下参考答案为自己搜集网上资料以及同学讨论所得,如有错误,还请指出。欢迎来信交流!

题目:

一个无序自然数数组,比如[100,2,1,3]求在0(n)时间复杂度内求出最大的连续自然数个数:输出应该是3

思路:

方法一:排序

可以采用一些排序方法比如基数排序、桶排序、记数排序等先进行排序。然后遍历一遍所有元素即可。当前这些排序有一些限制条件的。

方法二:维持一个hash表

维持一个hash表,大小为最大整数。遍历一次数组,用hash表记录出现在原始数组中的数。
然后设置四个个指示变量start,end,length,bestLength = 0。初始,start = end = 数组中第一个数,length = 1。然后不断执行下列操作:
end = end + 1.然后ziahash表中寻找end,如果能够找到,说明end存在原始数组中。一直到找不到end位置。
然后设置length = end - start。如果length大于bestLength,则更新:bestLength = length。
然后将start和end都设置为刚才为查找到的那个数,length = 1,接着重复上面的操作,最终的bestLength 便是最大的连续自然数个数。
由于hash的查找等操作都能在O(1)时间复杂度内完成,因此hash方法能够满足O(n)时间复杂度。

方法三:位图

用位图。类似方法二。
位图大小和最大的整数有关。位图中每一位为0或者1。位图某个位置index上为1表示index出现在原始数组中,反之不存在。遍历一遍原始数组建立位图之后,采用类似方法二中遍历hash表的方法遍历位图,找出最大的连续自然数个数。

位图的方法存在一个问题就是:可能最大的数很大,但是数的数目有很小,这时候要申请的位图的空间依然是很大,时候复杂度不是O(n)。

方法四:维持两个hash表

维持两个hash表tables:
Start表,其中的条目都是如下格式(start-point,length),包含的某个连续序列起始数以及序列长度。
End表,其中的条目都是如下格式(end-point,length),包含的某个连续序列结束数以及序列长度。
扫描原始数组,做如下操作:
对于当前值value,
判断value + 1是否存在于start表中。
如果存在,删除相应的条目,创建一个新条目(value,length + 1),同时更新end表相应条目,结束数不变,该对应长度加一。
判断value - 1是否存在于end表中。
如果存在,删除相应的条目,创建一个新条目(value,length + 1),同时更新start表相应条目,开始数不表,该对应长度加一。
如果在两个表中都存在,则合并两个已经存在的连续序列为一个。将四个条目删除,新建两个条目,每两个条目代表一个连续序列。
如果都不存在,则只需要在两个表中创建一个新的长度为1的条目。
一直这样等到数组中所有元素处理完毕,然后扫描start表寻找length值最大的那个即可。
这里要达到O(n)时间复杂度,start表和end表都用hash表实现,而且必须满足相关操作查找/添加/删除能够在O(1)时间复杂度内完成。
实例分析:
int[] input = {10,21,45,22,7,2,67,19,13,45,12, 11,18,16,17,100,201,20,101};
初始化状态:
Start table:{}
End table:{}
开始遍历数组:
10:两个数组中都不存在,添加条目。
Start table:{(10,1)}
End table:{(10,1)}
21:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,1)}
End table:{(10,1),(21,1)}
45:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,1),(45,1)}
End table:{(10,1),(21,1),(45,1)}
22:22-1=21存在于end表中需要进行更新。
Start table:{(10,1),(21,2),(45,1)}
End table:{(10,1),(22,2),(45,1)}

7:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1)}
End table:{(10,1),(22,2),(45,1),(7,1)}

2:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1)}

67:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1)}

19:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1),(19,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1),(19,1)}

13:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
End table:{(10,1),(22,2),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}

45:两个数组中都不存在,添加条目。
Start table:{(10,1),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}
End table:{(10,1),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,1)}

12:12+1=13存在start表中,更新。
Start table:{(10,1),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(12,2)}
End table:{(10,1),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1),(13,2)}

11:11+1=12都存在,合并。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,1)}

18:18+1=19存在start表中,更新。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(18,2)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,2)}

16:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(18,2),(16,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,2),(16,1)}

17:都存在,合并。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4)}

100:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4),(100,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4),(100,1)}

201:都不存在,添加条目。
Start table:{(10,4),(21,2),(45,1),(45,1),(7,1),(2,1),(67,1),(16,4),(100,1),(201,1)}
End table:{(13,4),(22,2),(45,1),(45,1),(7,1),(2,1),(67,1),(19,4),(100,1),(201,1)}

20:都存在,合并。
Start table:{(10,4),(16,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1)}
End table:{(13,4),(22,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1)}

101:都存在,合并。
Start table:{(10,4),(16,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1),(101,1)}
End table:{(13,4),(22,7),(45,1),(45,1),(7,1),(2,1),(67,1),(100,1),(201,1),(201,1)}

最后搜索start表,找到length值最大的,为7.连续自然数序列是:(16,17,18,19,20,21,22).
结束。
参考资料:
Longest Consecutive Sequence in an Unsorted Array

【实习笔试面试题】2013网易互联网实习笔试算法题-找出最大连续自然数个数相关推荐

  1. 网易2019实习生招聘算法题(一)

    网易2019实习生招聘算法题(一) 题目 为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬. 牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作. 牛牛的小伙伴太多了,于是 ...

  2. 一道笔试题:从1亿个整数中找出最大的一万个

    今天看到一篇赖永浩大牛的博客,由一道笔试题目谈算法优化.http://blog.csdn.net/lanphaday/archive/2008/12/19/3547776.aspx. 题目原题是从10 ...

  3. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  4. 经典面试题:64匹马,8个赛道,找出前4名最少比赛多少场?

    第一步:全部马分8组,各跑一次,然后淘汰掉每组的后四名(8次): 此时,只有列上有大小关系,行上是没有大小关系的. 最少10次选出前四,最多11次选出前四 在以上的两次比赛过后可以得出,A1 直接晋级 ...

  5. 2019 - iOS最新最全面试题梳理(内含框架和算法题)

    内存中的区域划分 栈区(stack):由系统自动分配和释放,存放局部变量的值,容量小速度快,有序 堆:一般由程序员分配和释放,如果不释放,则出现内存泄露.程序会回收您的内存,特点:容量大,速度慢,无序 ...

  6. 10亿数据找出前100大的数据(网易大数据面试算法题)

    精华在评论区.... 当时去面试的时候现场现写,憋了将近一个小时,用递归实现了,估计问题很多,不是人家怎么可能不要我,哈哈哈,开个玩笑: 思路就是新建一个长度为100数组array1,把前100个元素 ...

  7. (Google)谷歌笔试算法题:要求相邻的两个数都不小于或者不大于其本身的排序

    如题,要求相邻的两个数都不小于或者不大于其本身的排序, 那么也就是说每个数字必须同时大于等于或者小于等于它左右两边的数字,例如   3>=2<=6,那么这里2就是同时同于等于3且小于等于6 ...

  8. 2018百度运维岗秋招面试题:36匹马6跑道快速找出前三名

    36匹马赛跑,跑道同时只能容许6匹马.问最少跑多少次可以找出前三名 这道题是在2018年秋招百度面试官给我的问题,我投的是运维研发,要求是编程实现,很显然没有计时器不然还有啥问的,发博客也希望有大佬给 ...

  9. 蓝桥试题 算法提高 找出出卖耶稣的人 JAVA

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3-.凡 ...

最新文章

  1. 阿里将AI引入时尚界,消费者会对程序员的审美买账吗?
  2. vc 6.0 显示文件全路径_Linux常用命令大全(非常全!!!)
  3. JZOJ 5397. 【NOIP2017提高A组模拟10.6】Biology
  4. 三方面搞定http协议之“状态码”
  5. 朴素贝叶斯法(Naive Bayes,NB)
  6. bzoj3442学习小组
  7. Oracle索引状态查询与索引重建
  8. Facebook斥资5亿美元 建设全风电数据中心
  9. 手机网络游戏SDK集成指南
  10. 如何解决手机电话本CSV格式和VCF格式的转换
  11. Aliplayer的各种坑
  12. python牛顿迭代公式_牛顿迭代法Python实现
  13. 鸿蒙不是Linux也不是安卓
  14. linux+软盘启动程序,怎样制作Linux启动软盘.
  15. 为什么计算机网络使用数字信号,计算机网络数字电子技术的作用
  16. 06-SparkSQL
  17. 蒟蒻的单调队列orz,真的蒻
  18. QQ群龙王快速获得代码以及方法
  19. Python搭建开发环境
  20. Retrofit使用简介

热门文章

  1. opencv_modules.hpp 头文件
  2. einops.rearrange、repeat、reduce==>对维度进行操作
  3. estimate()==>从一组对应的点估算变换是否成功
  4. @RequestBody的与@RequestParam.
  5. docker 学习笔记一(教程) 快速上手
  6. worker mpm php,Ubuntu 16.04 安裝 Apache2.4 + mpm_worker + fastcgi + php7.0
  7. 单处理机系统的进程调度实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab3进程与异常(一)...
  8. html设置垂直高度,html – 具有垂直文本的100%高度块
  9. SEO按天关键词计费排名查询系统源码
  10. 强大的Spring Boot启动监听器事件-初始化系统账号密码