【面试】-百度外卖后端开发工程师
2015-09-14 10:22
441 查看
今天去奎科大厦参加百度外卖举行的小型招聘会。因为百度外卖要拆分成百度的一个子公司,因此今年单独举行了一个小型的招聘会。大致流程如下:9:00-10:20笔试,10:20-11:00百度外卖CTO简单宣讲,11:00-13:00面试。
首先是笔试,笔试题比较基础。十道选择题,三道编程题和一道附加题。选择题都是比较基础的知识,有C++,算法,逻辑题等等。编程题如下:
1.求一个月内百度外卖订单销量最多的前100名商户。
解析:这道题可以用变形的堆排序。一种思路是用最大堆来做:先把整个数组建最大堆,然后每次取出堆顶的元素,再重新调整堆,直到取完前100个最大数为止。另一种思路是用最小堆来做:取前100个数来建最小堆,然后遍历剩下的所有元素,让元素与堆顶元素比较,如果比堆顶元素大,则把该元素置换到堆顶,重新调整堆,最后剩下的100个元素即为最大的100个元素。代码就不贴了,关于堆排序的原理和代码可以参考我写的这篇博客:/article/1826712.html。
2.写二分查找算法。
解析:这个是再常见不过的算法题了,代码请见博客:/article/1826716.html
3.一个链表,除了有next指针外,还有一个指向任意节点的random指针,对该链表进行深拷贝。
解析:这是leetcode上的一道原题,可以参考我写的另一篇博客:/article/1826700.html
由于时间关系,最后一道附件题没做,面试的时候从面试官那看到我的卷子,给了70分。我觉得对于我这水平来说已经不错了。笔试完了就是CTO宣讲,之后就是面试了。一面的面试官问的问题都是C++基础相关的问题和算法,整理如下:
1.C++中虚函数的用法和原理
虚函数是用来实现多态的,当一个基类函数声明为虚函数后,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数。虚函数使用虚函数表来实现的。
2.C++中内存分配的方式
1)栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2)堆区(heap): 动态分配内存,用new/malloc时开辟,delete/free事释放。
3)全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,程序结束后由系统释放。
3.new/delete和malloc/free的区别
Malloc()与 free()是C语言的标准库函数, new/delete 是C++的运算符, 他们都可以用来申请和释放内存, malloc()和free()不在编译器控制权限之内,不能把构造函数和析构函数的任务强加给他们。
4.怎样检测内存泄露
这个实在是不会。看到网上给的一种方法:每当申请一块内存后,把指向它的指针加入到List中,当释放时,再把对应的指针从List中删除,到程序最后检查List就可以知道有没有内存泄露了。
5.string int_to_string(int id)这样定义函数有什么不好的地方
这个实在是不知道怎么考虑,后来面试官给我讲解这个问题。定义函数时最好不要直接返回string类型,而是把string用引用传递的方法,作为一个参数传进来,返回的时候返回一个bool值,判断是否执行成功。这样比较好处理函数中发生的异常。
6.有两个字符串a和b,如果a中的字符在b中出现,则把该字符在a中删除,返回剩余a的字符串。比如a为”xcvf”,b为”dfgh”,则返回”xcv”。
我是用map做的,代码如下:
7.求数组中连续子数组的最大和。
这是一道特别经典的线性规划的题目,也是leetcode上的原题。下面这篇博客详细的讲解了线性规划的解题方法,以及这道题的思路和代码实现,大家可以参考:http://blog.csdn.net/kevin_zhai/article/details/48376377
8.有10个外卖骑士和100份订单,设计一个调度系统,能够合理的给骑士分配订单。
这是一道开放题目,尽情发挥即可。
因为我C++和算法掌握的比较好,一面感觉还是比较简单的,不过第4题和第5题还是没答上来。顺利的通过一面后,接下来就是二面了。因为一面问了很多算法和C++,二面面试官主要问了其他一些知识,数据库,计算机网络,Linux等等。这些都是我的弱项,尤其是数据库和计算机网络,都不知多少年没复习过了。虽然题目应该都不算难,但直接被虐哭。。。。大致题目如下:
1.post和get的区别
以下是百度知道给的答案,仅供参考:
(1)get是从服务器上获取数据,post是向服务器传送数据。
(2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP
post机制,将表单内各个字段与其内容放置在HTML
HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
(3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
(5)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
2.tcp协议和http协议的区别
网上答案:httpd
是一个叫超文本协议的高层协议,而TCP、IP协议集,包过许多的子协议。
包括:传输层的FTP,UDP,TCP协议等,网络层的IP协含义等,高层协议如HTTP,TELNET协议等,HTTP是TCP、IP的一个子协议。
3.tcp建立连接的过程
(1)客户 端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通 讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
4.tcp和udp的区别
(1)基于连接与无连接;
(2)对系统资源的要求(TCP较多,UDP少);
(3)UDP程序结构较简单;
(4)流模式与数据报模式 ;
(5)TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
5.类似于QQ这种服务,用什么协议通信比较好
这个,实在是不知道怎么考虑。。。
6.STL中的vector底层实现原理
这个也是经常被问到的,请参考博客:http://blog.csdn.net/kevin_zhai/article/details/47747001
7.Linux下find查找某一种类型文件的命令
find 目录 –name *.文件的后缀名
8.Linux下查看一个文件最后10行的命令
tail –n 10 文件名
9.查看Linux内核的命令
当时忘记了,应该是:uname -a
10.数据库中事务的概念
不会,网上找的答案:数据库事务(DatabaseTransaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
11.设计一个key-value检索系统,key为id值,value为大小0-1MB的字符串。分别实现添加、删除、修改和多线程查找的功能。
我当时回答的是底层用map来做,每当对value值进行添加、删除和修改操作时,要加锁,这样就避免了在查找时,取到的字符串与实际不符。
感觉别虐惨了,1,2,3,5,9,10都没答上来。
最大的感触:基础还是太差,尤其是计算机网络、操作系统、Linux和数据库这些,还是得加强基础学习啊!!!重要的事情说三遍,基础!基础!!基础!!!
首先是笔试,笔试题比较基础。十道选择题,三道编程题和一道附加题。选择题都是比较基础的知识,有C++,算法,逻辑题等等。编程题如下:
1.求一个月内百度外卖订单销量最多的前100名商户。
解析:这道题可以用变形的堆排序。一种思路是用最大堆来做:先把整个数组建最大堆,然后每次取出堆顶的元素,再重新调整堆,直到取完前100个最大数为止。另一种思路是用最小堆来做:取前100个数来建最小堆,然后遍历剩下的所有元素,让元素与堆顶元素比较,如果比堆顶元素大,则把该元素置换到堆顶,重新调整堆,最后剩下的100个元素即为最大的100个元素。代码就不贴了,关于堆排序的原理和代码可以参考我写的这篇博客:/article/1826712.html。
2.写二分查找算法。
解析:这个是再常见不过的算法题了,代码请见博客:/article/1826716.html
3.一个链表,除了有next指针外,还有一个指向任意节点的random指针,对该链表进行深拷贝。
解析:这是leetcode上的一道原题,可以参考我写的另一篇博客:/article/1826700.html
由于时间关系,最后一道附件题没做,面试的时候从面试官那看到我的卷子,给了70分。我觉得对于我这水平来说已经不错了。笔试完了就是CTO宣讲,之后就是面试了。一面的面试官问的问题都是C++基础相关的问题和算法,整理如下:
1.C++中虚函数的用法和原理
虚函数是用来实现多态的,当一个基类函数声明为虚函数后,指向基类的指针在操作它的多态类对象时,会根据不同的类对象,调用其相应的函数。虚函数使用虚函数表来实现的。
2.C++中内存分配的方式
1)栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2)堆区(heap): 动态分配内存,用new/malloc时开辟,delete/free事释放。
3)全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,程序结束后由系统释放。
3.new/delete和malloc/free的区别
Malloc()与 free()是C语言的标准库函数, new/delete 是C++的运算符, 他们都可以用来申请和释放内存, malloc()和free()不在编译器控制权限之内,不能把构造函数和析构函数的任务强加给他们。
4.怎样检测内存泄露
这个实在是不会。看到网上给的一种方法:每当申请一块内存后,把指向它的指针加入到List中,当释放时,再把对应的指针从List中删除,到程序最后检查List就可以知道有没有内存泄露了。
5.string int_to_string(int id)这样定义函数有什么不好的地方
这个实在是不知道怎么考虑,后来面试官给我讲解这个问题。定义函数时最好不要直接返回string类型,而是把string用引用传递的方法,作为一个参数传进来,返回的时候返回一个bool值,判断是否执行成功。这样比较好处理函数中发生的异常。
6.有两个字符串a和b,如果a中的字符在b中出现,则把该字符在a中删除,返回剩余a的字符串。比如a为”xcvf”,b为”dfgh”,则返回”xcv”。
我是用map做的,代码如下:
char* deleteChar(char a[],char b[]) { map<char,int> chMap; char *result=a; int j=0; for(int i=0;b[i]!='\0';i++) { chMap[b[i]]=1; } for(int i=0;a[i]!='\0';i++) { if(chMap.find(a[i])==chMap.end()) { result[j]=a[i]; j++; } } result[j]='\0'; return result; }
7.求数组中连续子数组的最大和。
这是一道特别经典的线性规划的题目,也是leetcode上的原题。下面这篇博客详细的讲解了线性规划的解题方法,以及这道题的思路和代码实现,大家可以参考:http://blog.csdn.net/kevin_zhai/article/details/48376377
8.有10个外卖骑士和100份订单,设计一个调度系统,能够合理的给骑士分配订单。
这是一道开放题目,尽情发挥即可。
因为我C++和算法掌握的比较好,一面感觉还是比较简单的,不过第4题和第5题还是没答上来。顺利的通过一面后,接下来就是二面了。因为一面问了很多算法和C++,二面面试官主要问了其他一些知识,数据库,计算机网络,Linux等等。这些都是我的弱项,尤其是数据库和计算机网络,都不知多少年没复习过了。虽然题目应该都不算难,但直接被虐哭。。。。大致题目如下:
1.post和get的区别
以下是百度知道给的答案,仅供参考:
(1)get是从服务器上获取数据,post是向服务器传送数据。
(2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP
post机制,将表单内各个字段与其内容放置在HTML
HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
(3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
(4)get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
(5)get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
2.tcp协议和http协议的区别
网上答案:httpd
是一个叫超文本协议的高层协议,而TCP、IP协议集,包过许多的子协议。
包括:传输层的FTP,UDP,TCP协议等,网络层的IP协含义等,高层协议如HTTP,TELNET协议等,HTTP是TCP、IP的一个子协议。
3.tcp建立连接的过程
(1)客户 端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。
(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通 讯。
(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。
4.tcp和udp的区别
(1)基于连接与无连接;
(2)对系统资源的要求(TCP较多,UDP少);
(3)UDP程序结构较简单;
(4)流模式与数据报模式 ;
(5)TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
5.类似于QQ这种服务,用什么协议通信比较好
这个,实在是不知道怎么考虑。。。
6.STL中的vector底层实现原理
这个也是经常被问到的,请参考博客:http://blog.csdn.net/kevin_zhai/article/details/47747001
7.Linux下find查找某一种类型文件的命令
find 目录 –name *.文件的后缀名
8.Linux下查看一个文件最后10行的命令
tail –n 10 文件名
9.查看Linux内核的命令
当时忘记了,应该是:uname -a
10.数据库中事务的概念
不会,网上找的答案:数据库事务(DatabaseTransaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
11.设计一个key-value检索系统,key为id值,value为大小0-1MB的字符串。分别实现添加、删除、修改和多线程查找的功能。
我当时回答的是底层用map来做,每当对value值进行添加、删除和修改操作时,要加锁,这样就避免了在查找时,取到的字符串与实际不符。
感觉别虐惨了,1,2,3,5,9,10都没答上来。
最大的感触:基础还是太差,尤其是计算机网络、操作系统、Linux和数据库这些,还是得加强基础学习啊!!!重要的事情说三遍,基础!基础!!基础!!!
相关文章推荐
- 软件开发常见面试题
- 码农带你读《史记》
- 100+经典Java面试题及答案解析
- 我的程序员未婚夫
- 腾讯2016年9月14号面试笔试题
- 作为程序员,你最害怕的是什么?
- 程序员经常说的30句话,吐槽吧程序员!
- 一道博弈的面试题及其算法正确性证明
- 转自百度上一位大龄程序员的肺腑之言
- 开始记录我的程序员学习生涯--小小的我,也有大大的梦想;
- 黑马程序员——多线程
- 面试题总结1
- java多线程面试问题及答案
- 黑马程序员----反射
- 《剑指Offer》面试题:数组中的逆序对的总数
- 1 Two Sum
- IT职场心得
- 黑马程序员——Java基础——面向对象的特征(一)
- 程序员之路(高手的经验之谈)
- 黑马程序员──────Java基础───抽象、接口与文本的建立