一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 4233|回复: 44
收起左侧

facebook(Seattle) 电面 3.4

[复制链接] |试试Instant~ |关注本帖
shadowhunter 发表于 2015-3-5 23:59:56 | 显示全部楼层 |阅读模式

2015(1-3月) 码农类 硕士 全职@Facebook - 校园招聘会 - 技术电面 |Other

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

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
非常nice的小哥 career fair上投哒

problem 1: given a set of unique characters, find the minimun substring which cover all the characters in the set
leetcode 的简化版

problem 2: randomly return the index of maximal elements in the array. . 鍥磋鎴戜滑@1point 3 acres
follow up: 要求linear time 和constant space .鏈枃鍘熷垱鑷1point3acres璁哄潧


补充内容 (2015-3-6 06:08):
已拿到onsite。。

评分

9

查看全部评分

本帖被以下淘专辑推荐:

  • · fb|主题: 33, 订阅: 16
jas7 发表于 2015-3-13 13:31:25 | 显示全部楼层
这样只call一次Math.random()
  1. public int randomMax(int[] A) {
  2.         if (A == null || A.length == 0) {
  3.             return -1;
  4.         }
  5.         int max = A[0];
  6.         int index = 1;. 1point3acres.com/bbs
  7.         for (int i = 1; i < A.length; i++) {. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  8.             if (A[i] == max) {
  9.                 int temp = A[index];
  10.                 A[index] = i; 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  11.                 A[i] = temp;
  12.                 index++;.鐣欏璁哄潧-涓浜-涓夊垎鍦
  13.             } else if (A[i] > max) {. visit 1point3acres.com for more.
  14.                 max = A[i];
  15.                 index = 0;
  16.                 int temp = A[index];
  17.                 A[index] = i;
  18.                 A[i] = temp;
  19.                 index++;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴

  20.             } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
  21.         }
  22. . visit 1point3acres.com for more.
  23.         int random = (int) (Math.random() * index);
  24.         return A[random];
  25.     }
复制代码

补充内容 (2015-3-13 13:33):
把数组中所有的max数值移到数组的前面。
回复 支持 1 反对 1

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 01:58:01 | 显示全部楼层
xjwun 发表于 2015-3-6 01:52
想问下career fair投了多久被联系的?能详细讲讲第二题思路吗,如何做到让概率都一样?谢谢!

3 weeks吧。 第二题就是要keep 一个count的量 没遇到一个最大值就加1. 然后遇到最大值的时候 建立一个0-count 的随机数 如果 随机数是0 则把这个最大值的index刷新给返回值 否则不刷新。。 这样计算概率的话刚好是一样的。 楼主一开始也没想出来。。。 几乎是在最后一分钟想出来的。。 估计要加面了
.1point3acres缃
补充内容 (2015-3-6 01:58):
typo。。。 是每遇到一个
回复 支持 1 反对 0

使用道具 举报

houqingniao 发表于 2015-3-6 01:32:49 | 显示全部楼层
第二题啥意思。。。
有啥trick。。。
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 01:34:52 | 显示全部楼层
houqingniao 发表于 2015-3-6 01:32
第二题啥意思。。。
有啥trick。。。

maximal elements 可能不止一个。。 在call你这个function的时候 要做到 返回每个maximal elements index的概率都一样
回复 支持 反对

使用道具 举报

xjwun 发表于 2015-3-6 01:52:02 | 显示全部楼层
想问下career fair投了多久被联系的?能详细讲讲第二题思路吗,如何做到让概率都一样?谢谢!
回复 支持 反对

使用道具 举报

zengm321 发表于 2015-3-6 01:53:21 | 显示全部楼层
第二题用reservoir sampling
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 01:59:41 | 显示全部楼层
zengm321 发表于 2015-3-6 01:53
第二题用reservoir sampling

厉害 当时不知道这个。。 在他提示下 才想出来的
回复 支持 反对

使用道具 举报

zengm321 发表于 2015-3-6 02:29:11 | 显示全部楼层
shadowhunter 发表于 2015-3-6 01:59
厉害 当时不知道这个。。 在他提示下 才想出来的
. from: 1point3acres.com/bbs
那你也够厉害的,能当场想出来
一般就2 passes,第一次找最大值和出现次数
第二pass,遇到最大值就按1/count的概率选
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 03:24:54 | 显示全部楼层
zengm321 发表于 2015-3-6 02:29
那你也够厉害的,能当场想出来
一般就2 passes,第一次找最大值和出现次数.鐣欏璁哄潧-涓浜-涓夊垎鍦
第二pass,遇到最大值就按1/ ...

不用2 pass. 每次遇到arr==max 的情况都算一次就好了

补充内容 (2015-3-6 03:25):
arr==max
. from: 1point3acres.com/bbs
补充内容 (2015-3-6 03:27):
怎么显示不了。。。 maintain一个max值 如果遍历的数大于max, max更新 返回index更新 count=1 如果等于 count++, 并且摇一个数
回复 支持 反对

使用道具 举报

zengm321 发表于 2015-3-6 06:15:27 | 显示全部楼层
shadowhunter 发表于 2015-3-6 03:24
不用2 pass. 每次遇到arr==max 的情况都算一次就好了

补充内容 (2015-3-6 03:25):

摇的数要除以到目前最大元素的个数,才是要求的概率。直接抛硬币是不行的。
回复 支持 反对

使用道具 举报

lzd1127 发表于 2015-3-6 06:34:23 | 显示全部楼层
shadowhunter 发表于 2015-3-6 03:24
不用2 pass. 每次遇到arr==max 的情况都算一次就好了

补充内容 (2015-3-6 03:25):

LZ啥时候去?
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 09:37:15 | 显示全部楼层

我3月10号去加州 面完pocket gem 面Facebook
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 09:39:47 | 显示全部楼层
zengm321 发表于 2015-3-6 06:15
摇的数要除以到目前最大元素的个数,才是要求的概率。直接抛硬币是不行的。

但是算max的时候 keep一个max值 如果扫到的值==max count++, random(0, count), 如果返回值是0 则刷新返回的index 否则刷新 如果大于max, 把当前值付给max并count=1; 且刷新返回的index这样 一边就够啦
.鏈枃鍘熷垱鑷1point3acres璁哄潧
补充内容 (2015-3-6 09:40):. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
typo 否则不刷新
回复 支持 反对

使用道具 举报

fangl086 发表于 2015-3-6 10:44:34 | 显示全部楼层
第二题 你当时不考虑空间是怎么做的?
比如[1,1,2,2,3,3,4,4,5,5]用你的方法“扫到的值=?=max count++, random(0, count), 如果返回值是0 则刷新返回的index 否则不刷新”
是不是读到每个元素都要调用random(0, count),这样是不是不对了?
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 11:05:22 | 显示全部楼层
fangl086 发表于 2015-3-6 10:44
第二题 你当时不考虑空间是怎么做的?
-google 1point3acres比如[1,1,2,2,3,3,4,4,5,5]用你的方法“扫到的值=?=m ...
. more info on 1point3acres.com
不是 只有扫到的值==max才要 random(0, count)

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 11:08:43 | 显示全部楼层
fangl086 发表于 2015-3-6 10:44
第二题 你当时不考虑空间是怎么做的?
比如[1,1,2,2,3,3,4,4,5,5]用你的方法“扫到的值=?=m ...

这是我当时写的code
-----------------------------------------
public int findMax(int[] arr){
    int len = arr.length;
    int ret =-1;
    int max = -1;
    int count=0;
    for(int i=0; i<len; i++){
        if(arr==max){ 鏉ユ簮涓浜.涓夊垎鍦拌鍧.
            count++;.1point3acres缃
            int judge = new Random.nextInt(count);
            if(judge==0){
                ret = i;
            }
        }else if(max==-1 || arr>max){
            max = arr;. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
            ret = i;
            count=1;
        }
    }
    return ret;
}


补充内容 (2015-3-6 11:10):
有一个地方po错了 是max=arr

补充内容 (2015-3-6 11:11):
后面那个显示不了 max=arr中的第i个

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

xdxiaoxin 发表于 2015-3-6 14:32:26 | 显示全部楼层
能不能这样做呢, 先扫一遍数组 找到最大值
然后while(true) {
    int idx = random(0....n);
   if (A[idx] != max) {
     continue;
   }
}
.鐣欏璁哄潧-涓浜-涓夊垎鍦
这样也是random return吧
回复 支持 反对

使用道具 举报

yuxrose 发表于 2015-3-6 14:40:28 | 显示全部楼层
shadowhunter 发表于 2015-3-6 11:08
这是我当时写的code
-----------------------------------------. From 1point 3acres bbs
public int findMax(int[] arr){

先恭喜lz拿到onsite!
我有一个问题不少太明白
比如array = 1,1,2,2,2,2
按照你的程序,扫到第一个2的时候, ret = 2;
扫到最后一个2的时候,random function return的数可能是0,1,2,3(因为count = 4)
如果judge = 0, ret = 5 最后一个数,所以return index = 5的情况是1/4
但如果judge != 0, ret = 2, 就是第一个2出现的地方,这样return index = 2的概率不是3/4吗?
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 21:58:47 | 显示全部楼层
xdxiaoxin 发表于 2015-3-6 14:32
能不能这样做呢, 先扫一遍数组 找到最大值
然后while(true) {
    int idx = random(0....n);

要求one pass
回复 支持 反对

使用道具 举报

 楼主| shadowhunter 发表于 2015-3-6 22:01:42 | 显示全部楼层
xdxiaoxin 发表于 2015-3-6 14:32
能不能这样做呢, 先扫一遍数组 找到最大值
然后while(true) {
    int idx = random(0....n);

你不知道最大值在arr里的分布。。 无法保证返回的每个概率都是一样
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-6 18:16

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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