创新工场笔试:
单选和编程题目
单选不怎么记得了,有几道比较难,这里记录一下
1)10个左右括号组成满足条件的方案数,这个典型的catalan数,也是一个X>=Y的组合问题,可以看一下组合相关知识求解;
2)K(M,N) 一个递推推导,我是推导一部分,然后找规律(好像是K(2,m)= 2*m+3)
if M == 0 return N+1;
if N == 0 return K(M,1);
else return K(M-1,K(M,N-1));
求K(3,3)
编程题目:
1) A,B,C 可以容纳1-20的克的水,首先C乘K克的水,然后输出如何A为空,则C可能盛水的情况; (每次只能选择一个瓶,该该瓶内的水全部导入到另外一个瓶,如果另外一个瓶子满了,则停止倒水)
可以用递归实现,用hash来保存中间状态;肯定可以穷尽;
创新工场一面:
实现插入,删除,查找都是O(logn)的数据结构,给出了skiplist即可;也可以用deque实现,这个还需要进一步看一下,它是vector和list的优点改进,提供了push_front和pop_front接口,可高效实现queue和priority_queue。
给有球面上一点,然后转动一个角度(a),求转动后角度的坐标(x,y,z),希望用O(1)直接给出来,表示无空间想象力,直接跪了。。。 提示:用经纬度表示球面上点,然后变化旋转轴,然后映射,还是很难,没解决出来。
小米笔试:
服务器开发:三道大题,一道附加题
第一题: 实现 bool isPalindrom(long num),判断整数是否为回文,不用内存空间;
第二题: 实现两个多项式的乘积;每个字符串的格式"(-4,4),(3,2),(3,1)"
string multiplyString(const string &s1,const string &s2); 设计有效的数据结构来实现该算法,我把string转变成了vector,导致占用了大量空间,有点麻烦;
这个应该能够通过设计更好的数据结构来实现;
第三题:要给1000个人排队,多个人可以发出请求,每个请求表示那些人在我前面,哪些人在我后面。这样判断是否最后存在有效队列?如果存在,输出一种有效队列。
这个我解法,是利用矩阵来判断是否存在冲突来判断有效性;然后根据矩阵可到达性来实现一种有效队列;
百度笔试:
简单题:
1)stack和queue
2)多态
3)TCP的四次关闭连接,和TIME_WAIT
程序题:
1)反转单词,尽量少用额外空间; 我实现空间O(1)
2)时间最长递增序列; 时间复杂度未要求,最快O(nlogn)
3) 有限自动机实现C语言中注释提取,忘记怎么写了
程序设计题:
多用户成绩实时查询和更新,以及朋友圈成绩和排名查询(类似于微信朋友圈游戏排名查询和更新系统的设计)
我考虑:数据库的设计,锁机制设计,分布式机制,缓存机制,多服务器响应机制。。。。有点蒙的感觉。。