zoukankan      html  css  js  c++  java
  • 搜狐面试记

    搜狐是一家挺大的公司,在搜索(浏览器)、新闻、视频、输入法(搜狗)、游戏等方面均有涉猎。

    面试没那么正规,因为就面试我一个人。一位正在工作的大哥拿着电脑来面试我。

    先自我介绍一下,然后给我出了一道题:
    给你一个随机函数rand2(),它等概率地返回0或者1,让你写一个函数等概率返回3,5,7三种数字。

    首先想到的肯定是二进制。3是011,5是101,7是111。只有前两位在变。可是我当时有点着急,思路很混乱,随便写了个

    x=rand2()<<2|rand2()<<1|rand2()
    y=(x%3)*2+3
    return y
    

    这显然不对呀,0,1,2,3,4,5,6,7 模3为0,1的概率为3/8,模3为2的概率为2/8。可是当时太蠢了,就是没想清楚。

    第二个问题,写SQL语句。
    订单表有四个属性:user_id,order_id,time,money,表示用户交了多少钱的订单。
    要求查询昨天交钱前100的用户及交钱金额。

    我想这太简单了

    select user_id,money from 
    order_table where time>昨天开始时间 and time<昨天结束时间 
    order by money desc
    limit 100
    

    面试官说:昨天一个用户可能交了好几次钱。
    我恍然大悟

    select user_id,sum(money) as sum_money 
    from order_table where time>昨天开始时间 and time<昨天结束时间
    order by sum_money desc
    group by user_id
    limit 100
    

    不知道为啥,就面试了大概20分钟,问了也就这两个问题,不知道能不能过,过不过都行。

    骑车回来的路上,还在思考第一道题。
    突然想到,3,5,7的前两位是01,10,11,如果产生了00继续循环不就完了。

    x=0
    while x==0 : x=rand2()<<1|rand2()
    return x<<1|1 
    

    跟林教主说了这个问题后,林教主果然见多识广,说算法导论上有这道题。
    原题是这样的:rand2()这个函数返回0的概率为p,返回1的概率为1-p;要求写一个函数等概率返回0,1,2。
    答案是这样:

    x=rand2()<<2|rand2()<<1|rand2()
    if x==1:return 0
    elif x==2:return 1
    else x==4:return 2
    

    得到这个答案之后,接着想。
    1位二进制数有两种:0概率为p,1概率为q
    2位二进制数有三种:00概率为pp,11概率为qq,01、10概率为pq,所以2为二进制数的容量就是2
    3位二进制数有:000概率ppp,001、010、100概率为ppq,110,101,011概率为qqp,111概率为qqq,所以容量为3
    用f(n)表示n位二进制的容量,那么f(n)就等于c(n,n/2),也就是组合数最大的那个数。
    所以如果要求等概率返回m个数字,那么至少需要n位二进制数,n为满足c(n,n/2)>=m的最小的整数。

    下面正式提出一个更形式化的问题:
    给定一个不等概率N随机数生成器,要求构造一个等概率的M随机数生成器,要求M随机数生成器尽量少调用N随机器,求M随机数生成器调用N随机数生成器的平均次数。

    这个问题第一步需要构造M随机数生成器,第二步需要计算期望。

    以“不等概率2随机器构造等概率3随机器”为例进行说明:

    000 continue
    001 return 0
    010 return 1
    100 return 2
    011 return 0
    110 return 1
    101 return 2
    111 continue
    

    上面这种构造方式能够充分利用编码,从而无用编码只有000和111
    设2随机器产生0的概率为p,产生1的概率为q,其中p+q=1;那么一次命中的概率为k=1-ppp-qqq,期望尝试次数为1/k,每次尝试需要调用3次2随机器,所以期望为3/k。
    当p=q=1/2时,一次命中的概率为1-(1/2)^3-(1/2)^3=3/4,期望尝试次数为4/3次,即1.3333333次,需要调用2随机器4次。

    由此又可构造一道更复杂的问题:
    小明有一个不等概率2随机器,小刚在小明基础上实现了一个等概率3随机器,小刚发现rand3()每次运行需要平均调用rand2()6.25次,求小明不等概率2随机器产生0的概率和产生1的概率各为多少?

    解:设小明的不等概率随机器产生0的概率为p,产生1的概率为q。
    则p+q=1,1/(1-ppp-qqq)=6.25/3
    得到:ppp+qqq=0.52,p+q=1
    解此一元三次方程组即可得到概率p,q

    面试终究是没有通过,收到拒绝邮件的时候还是惆怅了半天。我觉得我面试失败就失败在第一道题没反应过来。
    面试当然是不可能完全公平的测量每个人的水平,他们只能择优录取。面试也是十分注重发挥、十分注重运气的,一切看点。

    面试是有时间限制的,每个面试官面试一个人的时间是固定的。面试官一般都会准备若干个问题,按照顺序挨个问你,就像考试一样。如果在前面卡壳太久,后面面试官就没时间问你别的问题了。你的水平也就无从展示了。

  • 相关阅读:
    javaScript 基础知识汇总(六)
    javaScript 基础知识汇总(五)
    javaScript 基础知识汇总(四)
    WPF — Grid布局中行的高度和列的高度值定义的三种形式
    C# — 用递归实现斐波拉契数列的第n项
    C# — ref参数、params参数、out参数详解
    Android apk反编译教程
    WPF学习资源
    C# — 通过点击回车执行任务
    C# — MvvMLight框架入门资源
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6759870.html
Copyright © 2011-2022 走看看