求教一道软家面试题的最优解# JobHunting - 待字闺中
O*i
1 楼
面官后来反馈说,the best O(1) solution I know so far is to use a trie
真的能用trie达到O(1)么?如何实现?
*******************************************************************
给定一个大整数N,比如N = 100, 有如下的初始有序序列位于[0, N - 1]之间
[0 1] [4 5 6] [9 10 11] [20] [50] [90] [95 96] [98 99]
请设计一个数据结构保存这个初始序列,然后写一个函数,接受一个input参数x, 满足
0 <= x <= N - 1
1) 假如x在该结构中不存在,出错处理
2) 假如x在该结构中存在,返回x之后第一个不存在的数,并把该数写入结构中
例如
x = 8, 出错,初始序列中没有8
x = 5, 返回7, 序列变为
[0 1] [4 5 6 7] [9 10 11] [20] [50] [90] [95 96] [98 99]
x = 4, 返回8, 序列变为
[0 1] [4 5 6 7 8] [9 10 11] [20] [50] [90] [95 96] [98 99]
x = 0, 返回2, 序列变为
[0 1 2] [4 5 6 7 8] [9 10 11] [20] [50] [90] [95 96] [98 99]
x = 95, 返回97,序列变为
[0 1 2] [4 5 6 7 8] [9 10 11] [20] [50] [90] [95 96 97 98 99]
x = 96, 出错,找不到合适的数
******************************
我当时用了bitmap (bit vector),说开一个保存0到N - 1的bt[N],每个bit初始化为0
, 读入初始序列,设置相应bit为1
假如bt[x]为0, 出错
假如bt[x]为1, 考察x + 1, x + 2, x + 3,..., 直到找到第一个不存在的数y,满足
bt[y] = 0, 然后返回y并且设置bt[y] = 1
面试完才发现这样效率不高,比如对原始序列,x = 4, 我要考察x = 5, x = 6, x = 7
, 直到返回7再次输入x = 4, 我又考察x = 5, x = 6, x = 7, x = 8, 返回8。其中x =
5, x = 6, x = 7 上次都考察过了,重复劳动
所以不幸被拒了,请大家帮忙想一个时间空间都最优的解法,神马线段树,skip list,
链表,hash + 链表, 区间合并都往上砸,直到砸出让面试官最满意的解法为止,多
谢。
真的能用trie达到O(1)么?如何实现?
*******************************************************************
给定一个大整数N,比如N = 100, 有如下的初始有序序列位于[0, N - 1]之间
[0 1] [4 5 6] [9 10 11] [20] [50] [90] [95 96] [98 99]
请设计一个数据结构保存这个初始序列,然后写一个函数,接受一个input参数x, 满足
0 <= x <= N - 1
1) 假如x在该结构中不存在,出错处理
2) 假如x在该结构中存在,返回x之后第一个不存在的数,并把该数写入结构中
例如
x = 8, 出错,初始序列中没有8
x = 5, 返回7, 序列变为
[0 1] [4 5 6 7] [9 10 11] [20] [50] [90] [95 96] [98 99]
x = 4, 返回8, 序列变为
[0 1] [4 5 6 7 8] [9 10 11] [20] [50] [90] [95 96] [98 99]
x = 0, 返回2, 序列变为
[0 1 2] [4 5 6 7 8] [9 10 11] [20] [50] [90] [95 96] [98 99]
x = 95, 返回97,序列变为
[0 1 2] [4 5 6 7 8] [9 10 11] [20] [50] [90] [95 96 97 98 99]
x = 96, 出错,找不到合适的数
******************************
我当时用了bitmap (bit vector),说开一个保存0到N - 1的bt[N],每个bit初始化为0
, 读入初始序列,设置相应bit为1
假如bt[x]为0, 出错
假如bt[x]为1, 考察x + 1, x + 2, x + 3,..., 直到找到第一个不存在的数y,满足
bt[y] = 0, 然后返回y并且设置bt[y] = 1
面试完才发现这样效率不高,比如对原始序列,x = 4, 我要考察x = 5, x = 6, x = 7
, 直到返回7再次输入x = 4, 我又考察x = 5, x = 6, x = 7, x = 8, 返回8。其中x =
5, x = 6, x = 7 上次都考察过了,重复劳动
所以不幸被拒了,请大家帮忙想一个时间空间都最优的解法,神马线段树,skip list,
链表,hash + 链表, 区间合并都往上砸,直到砸出让面试官最满意的解法为止,多
谢。