alibaba

0人关注 关注 36人分享

面试经验(alibaba,共20条分享)

2018-06-28 | 校园招聘
面试过程:

2018年3月28日 阿里巴巴电话一面 当天下午4点左右,阿里巴巴从浙江杭州打来的电话:0571-28223456 ,一开始我没接到,5分钟后我才发现这个电话(提醒:手机一定不要静音,随时保证能接到电话),当我发现后就立即打回去,幸运的是,能够接通,阿里的接线系统还是很智能的,主动提示5分钟前有打我电话,并且自动转接到那个电话。接通之后我解释了一下,面试官语气很和蔼,主动提出给我打过来,我表示要花2分钟拿纸和笔,实际上我还拿了电脑,机智吧!

面试官问的面试题:

接下来就是面试内容: 面试主要分为三个部分:基础知识、项目内容和实习经历、应聘岗位相关知识和其他 一:基础知识 面试官会问你主要熟悉的语言,我是学C++的,然后他就开始问C++相关的知识,我主要问到了: A: C++的指针和引用的区别: 指针是一个对象,这个对象里存储的是它所指向的另一个对象的地址。引用其实是一个对象的别名,引用是必须在初始化时与对象绑定,而且一经声明,就不能再更改绑定到其他对象。 问题引申: 指针定义:值为地址的变量。 指针的运算:两个基本的运算符:&(取址运算符)和*(间接访问运算符/解引用指针),除此之外,还有加减算数运算,关系运算(== 和 !=),以及指针的类型转换:强制类型转换和C++类型转换操作符 static_cast<类型>(表达式) ,注意:void类型指针 void * pVoid 可以从任意类型的指针赋值(强制转换)而来。 指针分类:根据所指对象类型区分:int、char、double、class等,还有 nullptr 指针 和 void *指针; 常量指针(指向常量的指针) 和 指针常量(该指针是常量); 常量指针: const int * p ; 特点就是 const 是对 int 的修饰,说明所指对象是一个int 型常量。 指针常量: int * const p ; 特点就是 const 是对 * 的修饰,说明该指针是个常量。 升级问题:迭代器(iterator)和指针(pointer)区别:STL 容器类的 iterator 迭代器是类模板,它可以遍历容器内的全部或者部分元素,本质是封装了原生指针,提供了 比指针更高级的行为,可以成为智能指针,有++,-- ,->,*等操作,一共分为输入迭代器(input iterator)、输出迭代器(output iterator)、前向迭代器(forward iterator)、双向迭代器(bidirectional iterator)、随机存取迭代器(random access iterator)。 在范围上,pointer 属于 iterator 的一种(random access iterator) 在功能上,iterator 有着比 pointer 更细的划分并对应能力不同的功能(重载不同的运算符) 在行为上,iterator 比 pointer 更统一和良好的用法(更轻易使用 begin()、end()且不用担心越界) B:面向对象的三个基本特征:封装、继承、多态 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。 实现多态,有二种方式,覆盖,重载。覆盖,是指子类重新定义父类的虚函数的做法。重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。 多态的作用是什么呢? 封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用!多态的作用,就是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用。 C:C++内存管理:存储内容:   静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期内都存在,有编译器在编译的时候分配(数据段(存储全局数据和静态数据)和代码段(可执行的代码/只读常量))。   栈:保存局部变量。栈上的内容只在函数范围内存在,当函数运行结束的时候,这些内容也会自动销毁。其特点是效率高但是空间大小有限。   堆:由malloc系列函数或者new操作符分配的内存。其生命周期由free和delete决定。在没有释放之前一直存在,直到函数结束。其特点是使用灵活,空间比较大,但容易出错。 值得注意的一点是:代码段中存储的是可执行的代码和只读常量,很多人看到代码段就认为里面只有代码,数据段里面才是存储数据的,其实不是这样的。 内存申请和释放: malloc和free函数是一一对应的,如果malloc两次但是只free一次就会存在内存泄漏,如果malloc一次但是free了两次,就会出错 我们知道c++是兼容c的,那我们明明已经有了malloc和free来进行动态内容的管理,为什么c++还要定义new和delete运算符来动态管理内存。   实际operator new/operator delete 只是malloc和free的一层封装。 来看一下它们之间的区别和联系:   1.它们都是动态管理内存的入口。   2.malloc/free是c/c++标准库的函数,new/delete是c++操作符。   3.malloc/free只是动态分配/释放内存空间。而new/delete出来分配空间还会调用构造函数和析构函数进行初始化与清理。   4.malloc/free需要手动计算类型大小且会返回void*, new/delete可以自己计算类型的大小,返回对应类型的指针。   我们在c++中是允许进行重载的,那我们也可以重载一下new和delete,我在这就不做了(其实new和delete是不能重载的,即使你进行了重载,也只是重载了operator new和operator delete)。 new和delete在内存中所做的事 new做的事: 1.调用operator new分配空间 2.调用构造函数初始化空间 delete做的事: 1.调用析构函数清理对象 2.调用operator delete释放空间 new[N]做的事: 1.调用operator new分配空间 2.调用N次构造函数分别初始化每个对象 delete做的事: 1.调用N次析构函数清理对象 2.调用operator delete释放空间 用一张图来解释: D:sleep()和wait()这两个方法的区别 1、sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定. 2、而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞 3、区别: sleep()和wait()函数的区别: (1)两者比较的共同之处是:两个方法都是使程序等待多少毫秒。 (2)最主要区别是:sleep()方法没有释放锁。而wait()方法释放了锁,使得其他线程可以使用同步控制块或者方法。 (3)sleep()指线程被调用时,占着CPU不工作,形象的说明为“占着CPU”睡觉。 sleep(2000)表示:占用CPU,程序休眠2秒。 wait(2000)表示:不占用CPU,程序等待2秒。 引申:挂起和阻塞区别: (1)挂起是一种主动行为,因此恢复也应该要主动完成。而阻塞是一种被动行为,是在等待事件或者资源任务的表现,你不知道它什么时候被阻塞,也不清楚它什么时候会恢复阻塞。 (2)阻塞(pend)就是任务释放CPU,其他任务可以运行,一般在等待某种资源或者信号量的时候出现。挂起(suspend)不释放CPU,如果任务优先级高,就永远轮不到其他任务运行。一般挂起用于程序调试中的条件中断,当出现某个条件的情况下挂起,然后进行单步调试。 程序状态变化图: E:进程和线程的区别 进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。进程是资源的分配单位,线程是CPU在进程内切换的单位,线程属于进程。 接下来是场景问题: I-面试--超大文件取交集:问题:现有两个各有20亿行的文件,每一行都只有一个数字,求这两个文件的交集。 我的回答:1.先将文件进行排序(外存排序),然后对两个文件中的数选一个hash函数,能将数据集范围的整数分到若干个桶中,每个桶中落入的数的个数能够内存处理即可 2. 每个桶内进行常规求交集即可 此题牵涉到外存排序:外排序分两个步骤:预处理和合并排序。先将文件分段;然后利用内部排序方法(快排,归并,堆排序等),将每一段排序成为顺串,生成后写入外存。这样外存上就得到了m个顺串。最后,对这些顺串进行归并,使得其长度逐渐增大,直到所有带排序的数字成为一个顺串为止。 外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。 第二部分:问的项目相关内容和实习内容 问:1、项目具体内容和分工;2、你负责的部分简单描述,分析其中的难点和收获;3、实习的具体工作职责和成效;4、实习收获到的知识。 第三部分:问测试相关的知识,这块问得比较浅,比如说平时用什么工具测试

公司动态

  • alibaba新增一条来自 前员工/在职员工 分享的工资待遇,包括以下内容:
  • 基本工资年终奖是否有保险是否有公积金是否准时下班周六周天是否加班详情>>
  • Alibaba新增一条来自 前员工/在职员工 分享的工资待遇,包括以下内容:
  • 基本工资年终奖是否有保险是否有公积金是否准时下班周六周天是否加班详情>>
  • alibaba新增一条来自 前员工/在职员工 分享的工资待遇,包括以下内容:
  • 绩效及提成加班工资年终奖是否有保险是否准时下班周六周天是否加班详情>>
企业名片
  • 公司性质:上市公司
  • 公司规模:
  • 公司地址:
  • 所属行业:互联网/电子商务 计算机软件 计算机服务(系统、数据服务、维修)
  • 官方网址: