百度2017校招面试总结

百度2017校招面试总结

之前报的是百度北京总部的C++软件开发岗,有幸通过了百度2017年校招的笔试,在9月24号参加了百度校招的面试,时间约在了上午11点,总共面了三面。

一面

一面主要问了以下几个问题:

给出一个正数n,实现一个函数来计算n的平方根,给出误差范围0.0001

这个问题主要有两种思路:一般能想到的是二分法,整个思路类似于二分查找,不断逼近最后的结果即可。具体代码如下:

double binarySqrt(double num){
    double error = 0.0001;
    double x = 1;
    double left, right;
    if (num <= 0) {
        return 0;
    }
    if (std::abs(num - 1) < error){
        return 1;
    }
    if (num > 1){
        left = 1;
        right = num;
    } else {
        left = num;
        right = 1;
    }
    while (std::abs(right - left) > error) {
        double mid = (right - left) / 2 + left;
        if (mid * mid > num){
            right = mid;
        } else {
            left = mid;
        }
    }
    return left;
}

第二种思路可能一般不太能想到,是用牛顿法来进行求解。
牛顿法的迭代公式如下:

xn+1=xnf(xn)f(xn),n=0,1,...

在本题中设 f(x)=x2n 则有 f(x)=2x ,牛顿法的迭代公式如下:
xn+1=x2n+n2xn,n=0,1,...
具体代码如下:

double NewtonSqrt(double num){
    double error = 0.0001;
    double x = num;
    if (num <= 0) {
        return 0;
    }
    while (std::abs(x * x - num) > error){
        x = (x * x + num) / (x * 2);
    }
    return x;
}

可以看出牛顿法的代码更简洁,同时牛顿法的迭代次数远少于二分法。

写一个单例模式

这个不多说了,很经典的设计模式,需要牢记。但是写之前需要先跟面试官进行沟通,例如是否需要考虑异常,是否需要考虑线程安全等。可以体现出面试者对问题考虑的全面性。

有两个文件,每个文件中有最大长度128字节的url一亿个,求两个文件的url的交集。

这道题实际上是考察面试者对大数据的处理思路,每个文件有一亿个url,每个url为128字节,计算下来文件有12.8GB,因此将文件全部加载进内存是不现实的。
若允许一定的误差,可以使用bloom filter将一个文件中的url进行hash后映射到内存空间中,然后遍历另一个文件,将url经过hash后查看内存位置的数值是否为1;若为0则一定不重复,若为1则有很大概率重复。
若要求不能接受误差,则可以使用B-树B+树对URL建立索引,之后对冲突的url在索引中进行查找即可。

服务器短时间内被很多IP访问,计算10s内访问时间超过10次的IP地址

针对每个IP,维护一个上次访问时间的链表,可以使用std::map的key-value的方式来进行存储。对于一个请求链接的IP,首先查找到相应的链表头结点,然后按照当前时间去掉链表中时间小于10s之前的节点,最后统计剩余链表的长度,若长度大于10,则是访问次数超过10次的节点。

上面两道题实际上都是大数据处理的问题,具体方式可以参照十道海量数据处理面试题与十个方法大总结中给出的思路

二面

二面过程中首先跟面试官聊项目,之后面试官问了如下两个问题:

使用概率知识来分析项目使用的算法的性能。

这个问题比较开放,面试官也没有正确的答案,但是可以与面试者共同探讨这个问题,分析这个问题需要概率论的基础,但是只要认真学过大学的概率论就没什么问题。感觉这一道问题考察的主要是面试者的数理功底以及对实际问题的抽象分析能力。

假设一个队列中的元素有不同的优先级,同时这个队列不断地插入元素,同时要求取出优先级最高的元素。用什么方法来实现这个需求,要求写出部分代码。

这个问题实际上是典型的优先级队列问题,使用堆排序的思想即可解决。

之后和面试官又聊了聊其他内容,通过二面。

三面

三面是经理面,简单地介绍了一下在学校做的项目之后,问了这样一个问题:

假设有一个停车场,设计一个调度算法在不堵住路的条件下最大利用停车位,要求10min内写出代码。

这道题感觉像是面试官临时出的,可能考察的是面试者的临场应变能力和面对压力的能力。在跟面试官进行一些细节上的沟通之后,被面试官提示说还剩5min…..。然后以最快的速度写出最简单的代码,交给面试官之后面试官问你觉得在你的代码中有哪些漏洞。随即说出了在写代码时考虑有欠缺的地方。

之后又跟面试官聊了一些个人发展意愿,职业规划相关的东西。然后就结束了面试,面试过后两个月接到电话通知,得知面试通过(这效率也是醉了…)。

总结

百度校招面试一般都是三面,问到的问题都是一些比较基础的知识。在校招的过程中,面试官对于面试者对计算机和数理基础知识的掌握程度非常看重。在应对校招面试之前,应先复习好操作系统,数据结构,算法分析和计算机网络的基础知识。若要应聘算法类岗位,则对微积分,线性代数,概率论和离散数学的基础知识也要进行一些准备。
对于快速排序堆排序折半查找等常用的排序or查找算法实现也应当牢记于心。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值