您的位置:首页 > 职场人生

【面试】-百度外卖后端开发工程师

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做的,代码如下:

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协议集,包过许多的子协议。
包括:传输层的FTPUDPTCP协议等,网络层的IP协含义等,高层协议如HTTP,TELNET协议等,HTTPTCP、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和数据库这些,还是得加强基础学习啊!!!重要的事情说三遍,基础!基础!!基础!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: