过去有好长时间了,还是4月份的事情,现在才来总结。看还能记得多少吧。
前后一个小时,全是算法题。
上来HR让简单自我介绍下,包括现在的项目。
算法部分:
有一个游戏,每一次玩家退出的时候,系统会记录一份日志,包括玩家本次登陆时间、退出时间。请设计一种算法,给出每个时间点当前在线玩家数量。
这题当时不知道怎么回答,函数入参是时间点,输出是在线玩家数量。这么答的:可以通过一次读取所有日志文件,判断时间点是否在对应登陆、退出时间之间,是则在线玩家数加1,遍历完成得到在线玩家数,但是时间复杂度为O(n),不知道是否符合要求。也可以用数据库,每次玩家退出,在数据库中记录玩家的登陆,退出时间,那么可以通过数据库操作,选出符合条件的记录,统计数量,得到对应时间点的在线玩家数。
HR没有再问,应该没有得到他想要的答案。有100亿个整数,设计算法求出最大的1万个数。
(假设是无符号整型) 这题与编程珠玑中的位文件的使用类似。100亿~10*2^30,一个整数一般为4byte,因此100亿个整数占用超过40G,故必然是以文件的形式存在。
定义一个数组A,将其初始化为全0;
遍历这100亿个整数,每次读取一个整数,将A中对应bit置1;
从A的高位开始遍历,判断对应位是否为1,是则取对应位的下标,直至出现1万次1,得到1万个下标,这1万个下标就是所求。
整数一般32bit,共有2^32个,因此A的大小为2^32/8 = 512Mbyte,因此数组A用文件替代更合适。有两个整型数的集合A和B,设计算法求A和B的交集。
这题思路类似第二题。
初始化新的数组C为全0;
遍历A中所有整数,将出现的整数作为C的下标,将对应下标的值加1;
同理遍历B中所有整数,将出现的整数作为C的下标,将对应下标的值加1;
遍历C,找到值为2的下标,即为A和B的交集。
面试官问是用字节还是用位来记录的?这里就该醒悟过来是不是用字节来记录。
正确的方法应该是:
初始化一个新的数组C为全0;
遍历A中所有整数,找到这个整数对应在C中的位,将对应位置1;
遍历B中所有整数,找到这个整数对应在C中的位,若该位是1,则该整数属于A和B的交集。TCP和UDP的区别是什么?
连接的,可靠性。TCP是如何保证数据的正确性的?
seq field,ACK field有没有开源项目经验?
没有。- 有没有写技术博客的习惯?
我看得多,写得少。
本文分享了一次算法面试的经历,涉及在线玩家数量统计、大规模整数处理、交集查找、TCP与UDP区别等算法问题,以及对数据库操作和编程语言的理解。面试官还询问了开源项目经验和写技术博客的习惯。
6420

被折叠的 条评论
为什么被折叠?



