网易2013笔试(C++)编程题

L_hunter 2013-03-27 10:03:30
最后一道大题:
给一个未经排序的自然数组。找出数组中最大的连续自然数序列的个数。如给定[100,2,1,3]。最大 连续自然数序列因为[1,2,3]。返回结果为3。
要求算法复杂度为O(n)。

感觉好难,想了好久没想出来。求各位大神知道
...全文
1075 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
L_hunter 2013-05-15
  • 打赏
  • 举报
回复
还是贴出正解吧。 ———————————————————————————————————————————————— 维持两个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)时间复杂度内完成。 ————————————————————————————————————————————————
z8323664 2013-04-03
  • 打赏
  • 举报
回复
[100,1,99,2,60,3] 最大的连续自然数序列 是99 100 吧? 怎么会是1 2 3?
L_hunter 2013-04-03
  • 打赏
  • 举报
回复
引用 29 楼 sniffer12345 的回复:
引用 8 楼 Life_Hunter 的回复:引用 2 楼 csdn5211 的回复:这个不难啊,基本就是寻找最大值的变种,可不就是O(n)。 你再想想吧,这个真的不难。 另外你打错了题吧,是[100,1,2,3]吧? 没有打错,是[100,1,2,3]那就太容易了。事实上[100,1,99,2,60,3]对应的最大连续自然序列也是[1,2,3] 这个“连续”……
额。这是我和参加笔试的其他同学一致认可的理解。如果按你那种理解,那你觉得答案应该是什么呢?
sniffer12345 2013-04-03
  • 打赏
  • 举报
回复
引用 8 楼 Life_Hunter 的回复:
引用 2 楼 csdn5211 的回复:这个不难啊,基本就是寻找最大值的变种,可不就是O(n)。 你再想想吧,这个真的不难。 另外你打错了题吧,是[100,1,2,3]吧? 没有打错,是[100,1,2,3]那就太容易了。事实上[100,1,99,2,60,3]对应的最大连续自然序列也是[1,2,3] 这个“连续”指数组排序后自然数间能连续,而和未排序前的位置……
我强烈觉得你理解错题目或者没看清 连续是一个严格的数学用词,哪有你这样想当然的 另外,最大连续子序列这题目年年考,因为他可以从o(n3)到o(n2)到o(n)都有相应的算法,很容易区分考生的程度
nice_cxf 2013-04-03
  • 打赏
  • 举报
回复
这题用hash把,不过函数不好选择,大概没法保证对任意情况冲突数量为常数,如果最大值为n,做到o(n)很简单,用位图就可以了,
L_hunter 2013-04-03
  • 打赏
  • 举报
回复
引用 26 楼 akirya 的回复:
基于3#的思路。 数组b可以做的复杂一些,分几个级别,比如第一个级别1-99999999 100000000-199999999 .... 第二个级别1- 9999 10000-19999 ... 第三个级别 1-99 100-199 ... 这样就能快速定位,也节省内存(需要的时候再分配二三级)。 每个位置不存bool值存指针,指针里面存计数,每次插入……
弱弱地表示,没看懂。。
  • 打赏
  • 举报
回复
基于3#的思路。 数组b可以做的复杂一些,分几个级别,比如第一个级别1-99999999 100000000-199999999 .... 第二个级别1- 9999 10000-19999 ... 第三个级别 1-99 100-199 ... 这样就能快速定位,也节省内存(需要的时候再分配二三级)。 每个位置不存bool值存指针,指针里面存计数,每次插入数字时判断前后有没有数字,有的话指针设置成一样的。合并前后计数再+1 每次操作的时候跟已保存的最大序列数字比较。 这样就保证只遍历原数据1次,就能得到最终结果。
a707000646 2013-04-02
  • 打赏
  • 举报
回复
可以考虑模拟kmp算法
L_hunter 2013-04-02
  • 打赏
  • 举报
回复
引用 11 楼 liao05050075 的回复:
或者考虑用线段树? 每个数字都是长度为1的区间。将所有数字插入树后,找最找的那一段
但是建立线段树的开销好像就不止要O(n)吧
L_hunter 2013-04-02
  • 打赏
  • 举报
回复
引用 20 楼 akirya 的回复:
引用 18 楼 Life_Hunter 的回复:引用 16 楼 akirya 的回复:连续自然数序列,限制已经很大了 只要后面一个数比前面一个数+1,就长度+1,否则就归零。归零前 将长度跟已保存最大长度比较一下 遍历结束之后,以保存最大长度不就是结果了么。 你还是没理解题目中“连续”的含义 那你解释下 连续 的含义
请看8楼
a707000646 2013-04-02
  • 打赏
  • 举报
回复
引用 19 楼 Life_Hunter 的回复:
引用 17 楼 a707000646 的回复:可以考虑模拟kmp算法 求详解??
说实在我没有细想,但是你可以看看kmp算法 当然 肯定不能跟kmp算法一样了 主要是主串不要回朔
yjlyp 2013-04-02
  • 打赏
  • 举报
回复
动态规划问题吧
  • 打赏
  • 举报
回复
引用 18 楼 Life_Hunter 的回复:
引用 16 楼 akirya 的回复:连续自然数序列,限制已经很大了 只要后面一个数比前面一个数+1,就长度+1,否则就归零。归零前 将长度跟已保存最大长度比较一下 遍历结束之后,以保存最大长度不就是结果了么。 你还是没理解题目中“连续”的含义
那你解释下 连续 的含义
L_hunter 2013-04-02
  • 打赏
  • 举报
回复
引用 17 楼 a707000646 的回复:
可以考虑模拟kmp算法
求详解??
L_hunter 2013-04-02
  • 打赏
  • 举报
回复
引用 16 楼 akirya 的回复:
连续自然数序列,限制已经很大了 只要后面一个数比前面一个数+1,就长度+1,否则就归零。归零前 将长度跟已保存最大长度比较一下 遍历结束之后,以保存最大长度不就是结果了么。
你还是没理解题目中“连续”的含义
  • 打赏
  • 举报
回复
连续自然数序列,限制已经很大了 只要后面一个数比前面一个数+1,就长度+1,否则就归零。归零前 将长度跟已保存最大长度比较一下 遍历结束之后,以保存最大长度不就是结果了么。
卖萌de猫 2013-04-01
  • 打赏
  • 举报
回复
说下思路:循环一次找出最大数max,动态生成一bool数组:长度为max,初始化为false。循环一次数组,如果为i,就把第i个元素设为true。循环动态数组,统计最长连续的(true就+1,false就清零)。每次都是O(n),所以是O(n)。
csdn5211 2013-04-01
  • 打赏
  • 举报
回复
感觉很难做到O(n),至少每个数要过一遍吧,这样每个数的处理至多是O(1),除了hash,没想到更好的。
bfdeh 2013-03-29
  • 打赏
  • 举报
回复
我也没想到好方法,留个记号,继续跟进
liao05050075 2013-03-29
  • 打赏
  • 举报
回复
或者考虑用线段树? 每个数字都是长度为1的区间。将所有数字插入树后,找最找的那一段
加载更多回复(11)

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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