回复: 11
跳转到指定楼层
上一主题 下一主题
收起左侧

脸书电面不知道这个题有人见过么

全局:

2018(10-12月) MachineLearningEng 本科 全职@meta - 猎头 - 技术电面  | | Other | 在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x

题目就一道,要求后来优化时间和性能。
[hide=120]给两个数组,求所有数对的差值绝对值的总和[/120]
先是实现O(M*N)的复杂度。之后要求改进优化。
思路是先排序,然后再用二分查找第一数组里的数在第二个数组出现的位置,比第一个数组里的数小的单独计算,比第一个数组里的数大
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
-1], F(A,B) = 1+4+6 + 4+9+1 = 25

补充内容 (2018-11-11 13:48):
求大米,更新了我当时的思路给大家参考。

评分

参与人数 6大米 +26 收起 理由
cfgx + 3 很有用的信息!
TTTynthia + 5 给你点个赞!
Wu_kong + 5 给你点个赞!
say543 + 3 很有用的信息!
spinova + 5 很有用的信息!

查看全部评分


上一篇:狗狗new grad技术店面经经经
下一篇:图森一面
推荐
 楼主| stonepeter 2018-11-11 13:41:14 | 只看该作者
全局:
看到下面有同学很认真的回复,我还是把我当时的思路仔细写写吧。
1、对B数组排序(时间复杂度O(m*log(m))
2、对A数组的每个数,在排好序的B数组中进行二分查找,从二分查找的位置对数组B进行分两半(时间复杂度O(n*log(m))
3、用O(m)的空间和O(n)的时间保存B数组的和,用于快速计算
4、对步骤2中的两半分别进行求和运算,因为左边一半(一共有k个)小于A数组的当前数a,所以|a-b|=a-b,求和的时候就变成了k*a - sum(B[:k]),而右边一半(一共有m-k个),这些数都大于或者等于当前数a,所以|a-b|=b-a,求和的时候就变成了sum(B[k:]) - (m-k-1) * a
4.1、关于求和的说明,因为在步骤3中已经保存过B的局部和了sum_b[i] = sum(B[:i]),所以左边一半的求和实际上是sum(B[:k])=sum_b[k], 而右边的一半求和是sum[k:]=sum_b[-1]-sum_b[k]。这时的时间复杂度是O(1)
4.2、面试官指出我的小BUG是上面的公式(m-k-1)我当时是写成了(m-k)
5、累计以上步骤的总和,就是最后的结果。总的时间复杂度应当是O((m+n)log(m))空间复杂度是O(m)
======
仔细回想这个题,其实已经考察了相当多的知识点,不失是一个用来面试的好题。因为最容易的O(n*m)的解法起码每个人都要会,而后面的优化可以把任何一个点做考点,一方面,如果被面的人想不出来这个解法,可以要求写一个二分查找,这个起码也是MEDIUM难度的面试题,因为这里的二分查找也不是一个标准的二分查找,因为被查找的数可能并不在数组中;另一方面,如果被面的人宣称找到了更优的解法,可以要求完成这个解法,这里最大的坑就是如果不熟悉的话可能想不起保存区部求和这个改进时间性能的做法,再一方面,如果被面的人能在三十分钟的时间内想到这个方法而且能没有BUG的写出来,的确会让人高看一线,尤其是在LEETCODE上没有原题的情况下。
回复

使用道具 举报

推荐
becoo 2018-11-10 12:21:37 来自APP | 只看该作者
全局:
看上去有戏啊。别放弃。。。
回复

使用道具 举报

推荐
xiebw 2018-11-10 09:12:29 | 只看该作者
全局:
我也和楼主想的一样,就排序长的数组,计算好前缀和,然后用短的数组的元素在长数组里面查找
回复

使用道具 举报

🔗
鱼淼淼 2018-11-10 15:16:10 | 只看该作者
全局:
lz这题可以举个例子详细说一下吗?不是很理解
回复

使用道具 举报

🔗
edyyy 2018-11-10 22:33:23 | 只看该作者
全局:
好像没见这题。。。。。。。
回复

使用道具 举报

🔗
 楼主| stonepeter 2018-11-11 01:31:44 | 只看该作者
全局:
# Given 2 arrays A,B # F(A,B) # consider all pairs (a,b) such that a is in A, b is in B # F(A,B) = sum |a-b| over all such pairs (a,b) # # |a-b| #   = a-b if a>=b #   = b-a otherwise #  # A = [3, 8, -2] (of size m) # B = [4, -1] (of size n) # F(A,B) = 1+4+6 + 4+9+1 = 25
回复

使用道具 举报

🔗
hbs198 2018-11-11 12:51:35 | 只看该作者
全局:
(1) 假设大数组m个数,小数组n个数, 先对小数组进行排序设为b1,b2,...,bn,这样把数轴分成了n+1个区间[-inf,b1],[b1,b2],...,[bn,+inf]

(2) 假设f(x)=|x-b1|+|x-b2|+...+|x-bn|, f(x)在每个区间都是线性函数f(x)=ax+b但是参数a,b不一样,计算出每个区间的参数a和b。(比如样例b1=-1,b2=4, 那3个区间[-inf,-1],[1,4],[4,+inf]的函数分别是-2x+3,5, 2x-3)

(3) 然后对于大数组的每个数ai,用二分查找找到位于第几个区间,然后由之前得到的参数a,b通过o(1)得到f(ai), 对f(ai)求和就是答案 (比如a2=8,位于第三个区间,f(8) = 2*8-3 =13)

时间复杂度为排序的 O(nlog n)+m个数二分查找O(m log n) = O[(m+n)log n]
空间复杂度为 O(m): 用来存参数ab
回复

使用道具 举报

🔗
 楼主| stonepeter 2018-11-11 13:44:01 | 只看该作者
全局:
hbs198 发表于 2018-11-11 12:51
(1) 假设大数组m个数,小数组n个数, 先对小数组进行排序设为b1,b2,...,bn,这样把数轴分成了n+1个区间[-in ...

谢谢分析。其实当时面试官已经很友好地把公式|a-b|定义单独写出来了。|a-b|==(a-b) if a>=b, else (b-a)。他这样写出来对分析和思考很有帮助。
回复

使用道具 举报

🔗
redbeanlyx 2018-11-12 04:56:07 | 只看该作者
全局:
A = [3,8,2], B = [4, -1], F(A,B) = 1+4+6 + 4+9+1 = 25. 这个例子是不是给错了 绝对值之和
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表