现在的位置: 首页 > 综合 > 正文

美团网面试总结

2017年09月15日 ⁄ 综合 ⁄ 共 3313字 ⁄ 字号 评论关闭

我是昨天下午4点在华工参加了美团网的笔试。技术类的笔试题都是一样的。我报的是研发工程师。笔试题总共8道大题,后面还有针对不同方向的附加题。都是需要些代码的编程题,考察数据结构的知识。要求在一个半小时之内做完。时间根本不够用,我一个小时才做完整了2道题。剩下的时间我就写了其他题的解决思路。我以为自己没戏了,结果当天晚上12:30接到了hr通知面试的电话。。。这么晚了还打电话。我第二天早上8:30到华工面试的。下面说下我的面试经历。

面试官是个不到30的年轻人。寒暄之后他拿出了我做过的试题。问我答得的怎么样,我说时间不够,答的不好,之后他让我写我没有做完的题,给我一道判断一棵树是否是水平镜像对称的题,经过几番努力我终于做出来了核心的代码。后面他就问我一些基础知识。

1、你了解tcp、ip吗,和对http的理解之类的。

协议的状态是指下一次传输可以“记住”这次传输信息的能力.http是不会为了下一次连接而维护这次连接所传输的信息的.无状态是指,当浏览器发送请求给服务器的时候,服务器响应,但是同一个浏览器再发送请求给服务器的时候,他会响应,但是他不知道你就是刚才那个浏览器,简单地说,就是服务器不会去记得你,所以是无状态协议。
而DNS是有状态协议 。
 
在这种客户端与服务器进行动态交互的Web应用程序出现之后,HTTP无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。

2、你项目中用过mysql,说明他的存储引擎是怎么样的……我完全没看过这方面的。

存储引擎是什么?

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。 MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

MySQL常用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。 

MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。 

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。 

MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。 

3、你用过jquery,那你说说jquery中的$如何和其他第三方的库中的$相区别。

jquery中有个专门的函数,可以把自己的$改为自己定义的名字,就可以避免冲突
jQuery多库共存机制指jQuery库完全兼容第三方库,例如jQuery中使用$做为函数入口,在该页面同时引入另一个库,其中也使用了$做为函数名。因此jQuery与该库发生冲突,例1:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<HTML> 
 <HEAD> 
  <TITLE> New Document </TITLE> 
    <script src = "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" language = "javascript"></script> 
    <SCRIPT LANGUAGE="JavaScript"> 
  <!--  
 //第三方库  
  function $(str)  
  {  
  return document.getElementById(str) ;  
  }  
 
  function jQuery(str)  
  {  
  return document.getElementById(str) ;  
  }  
  //--> 
  </SCRIPT> 
 </HEAD> 
 
 <BODY> 
 <input type = "text" id = "txt1" value = "aa" /> 
 </BODY> 
</HTML> 

在如上示例中 第三方库同时使用了"$"与"jQuery",此时jQuery入口被第三方库覆盖了。jQuery提供了noConflict函数解决冲突,例2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<HTML> 
 <HEAD> 
  <TITLE> New Document </TITLE> 
    <script src = "http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" language = "javascript"></script> 
 <script> 
  //兼容代码  
  var $1 = $.noConflict();  
  $1(document).ready(function(){  
   alert($1("#txt1").val())  
   alert($("txt1").value) ;  
  })  
 </script> 
    <SCRIPT LANGUAGE="JavaScript"> 
  <!--  
 //第三方库  
  function $(str)  
  {  
  return document.getElementById(str) ;  
  }  
 
  function jQuery(str)  
  {  
  return document.getElementById(str) ;  
  }  
  //--> 
  </SCRIPT> 
 </HEAD> 
 
 <BODY> 
 <input type = "text" id = "txt1" value = "aa" /> 
 </BODY> 
</HTML> 

noConflict重新将jQuery入口指针指向$1,此时可以用$1访问jQuery库,其中兼容代码要写在第三方库载入之前(如果写在之后,jQuery的$和jQuery入口被第三方库覆盖了,无法调用兼容代码)。

4、你说说malloc在内存中的具体工作机制

malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
Linux Libc6采用的机制是在free的时候试图整合相邻的碎片,使其合并成为一个较大的free空间。

抱歉!评论已关闭.