• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ArgenBarbie
博客园    首页    新随笔    联系   管理    订阅  订阅
hulu

一、

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

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. 求完全二叉树的最后一个节点

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

对某个节点,若其左子树深度大于右子树,则该子树深度为左子树深度加一,返回其左子树最右节点指针;否则,该子树深度为右子树深度加一,返回其右子树最右节点指针。

 

posted on 2016-04-03 10:15  ArgenBarbie  阅读(301)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3