您的位置:首页 > 其它

hulu

2016-04-03 10:15 190 查看
一、

一开始因为没收到含有共享文档链接的邮件,所以简单自我介绍,聊了几句项目。问了:

1. 玩嗨如果数据库结构变化要怎么办

2. 哈佛项目是否为官方渠道

一直没收到邮件,面试官读网址给我,进到共享文档界面。

共享文档编程:

1. 单链表的快速排序

我先求了长度,他说不用求长度。

第一个元素为枢轴,然后把当前链表分成两个链表,一个全部是小于等于枢轴的元素,另一个全部是大于等于枢轴的元素,然后递归快排这两个新链表,最后把它们连起来。

2. 给一个无序数组,元素不重复,连续数字的最大长度。例:[4,5,1,3,8,9]的最长连续数字为[3,4,5],所以最大长度为3。

我先说的排序,然后遍历。时间复杂度O(nlogn)。

面试官说时间复杂度低一些的呢。

提示可以用额外的存储空间来换时间。

最后说出来用哈希表存储每个元素是否出现,然后从每个元素开始找它加1的元素是否存在,若存在则长度加1,若不存在则重新计数。

具体实现:首先遍历链表用map记录元素是否存在(map.find(element) != map.end()即元素存在),然后再遍历链表,对每一个元素,找比它大和比它小的连续元素,从map中删除所有找过的元素,记录最大长度。

时间复杂度O(n)。

3. 给一个n,求从0到n所有数字的二进制表示中1的个数。

n为偶数时,n的二进制表示中1的个数 = (n/2)的二进制表示中1的个数。

n为奇数时,n的二进制表示中1的个数 = (n-1)的二进制表示中1的个数 + 1。

设f(n)为 0到n所有数字的二进制表示中1的个数。

n为奇数时,0到n的所有偶数的二进制表示中1的个数为 f(n/2),0到n的所有奇数的二进制表示中1的个数为 f(n/2)+(n+1)/2。

n为偶数时,0到n的所有偶数的二进制表示中1的个数为 f(n/2),0到n的所有奇数的二进制表示中1的个数为 f((n-1)/2)+((n-1)+1)/2。

综上,

f(n) = f(n/2) * 2 + (n+1) / 2, n为奇数

f(n/2) + f((n-1) / 2) + n/2, n为偶数

二、

五道算法题:

1. 矩形覆盖层数:给n个矩形的长和宽,长宽都大于等于的可以覆盖,问最多能覆盖的层数。

按矩形的宽和长从小到大排序,然后动态规划。

从第一个开始,记录到它为止最大覆盖层数。

对每个矩形,遍历它前面的所有矩形,若能覆盖,则更新该矩形的覆盖数的最大值。

2. 求排列的下一个

从最右开始找到n[i]<n[i+1]的第一对相邻数字。若没有则说明没有下一个排列。

将n[i]与最右数字(即i到最右的最小数字)交换,再将i+1到最右排序。

3. n个人比赛 0 VS 1, 2 VS 3, ..., (n-2) VS (n-1), 问i和j什么时候相遇(假设i和j每次都能胜出)。

假设都是编号较小者胜。

第一局:0 VS 1, 2 VS 3, ..., (n-2) VS (n-1)

第二局:0 VS 2, 4 VS 6, ..., (n-2) VS (n-1)

当 i / 2^k == j / 2^k 时,i和j相遇。

4. 求n位字符串有多少种形式

5. 求完全二叉树的最后一个节点

递归后序遍历,每次返回该子树的深度和其中最右节点指针。

对某个节点,若其左子树深度大于右子树,则该子树深度为左子树深度加一,返回其左子树最右节点指针;否则,该子树深度为右子树深度加一,返回其右子树最右节点指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: