[腾讯面试]重新登入的qq号并打印出来

解答: 第二题如果空间足够大,可以定义一个大的数组
a[qq号],初始为零,然后这个qq号登陆了就a[qq号]++
最后统计大于等于2的QQ号
这个用空间来代替时间
 
第二个题目,有不成熟的想法。
2w x 300s
所以用 6,000,000 个桶。删除超时的算法后面说,所以平均桶的大小是 1 。
假设 qq 号码一共有 10^10 个,所以每个桶装的 q 号码是 10^10 / (6 * 10^6) 个,这个是插入时候的最坏效率(插入同一个桶的时候是顺序查找插入位置的)。
qq的节点结构和上面大家讨论的基本一样,增加一个指针指向输出列表,后面说。
struct QQstruct {
  num_type   qqnum;
  timestamp  last_logon_time;
  QQstruct   *pre;
  QQstruct   *next;
  OutPutList *out;    // 用于 free 节点的时候,顺便更新一下输出列表。
}
 
另外增加两个指针列表。
第一个大小 300 的循环链表,自带一个指向 QQStruct 的域,循环存 300 秒内的qq指针。时间一过
就 free 掉, 所以保证所有桶占用的空间在 2w X 300 以内。
第二个是 输出列表, 就是存放题目需要输出的节点。
如果登陆的用户,5分钟内完全没有重复的话,每秒 free 掉 2w 个节点。
不过在 free 的时候,要判断一下时间是不是真的超时,因为把节点入桶的时候,遇到重复的,会更
新一下最后登陆的时间。当然啦,这个时候,要把这个 qq 号码放到需要输出的列表里面。

 

你可能感兴趣的:(算法,qq,struct,面试,腾讯)