面试我的是一个小姑娘,目测年龄和我相似。由于之前已经在电话中,聊过一些,所以,并没有让我做自我介绍。这点我很满意,我一直比较讨厌自我介绍这个问题,尽管我面试别人的时候,也会问这个问题。 小姑娘先问我觉得招聘是否好做,因为我这段时间一直在做关于技术人员的招聘,所以,就回答了最近的一些感想。我说现在这个阶段招聘已经进入淡季,就Android开发人员来说,现在市场处于求大于供的阶段。但对于招聘人员来讲,招聘没有好做难做之分,因为每个企业都有优点,也存在缺点,你只需要坚持正确的方法,一定可以找到合适的人。比如,更加积极主动的搜索简历、打电话,在招聘过程中给予面试人员更多的关怀。
面试官问的面试题:AlibabaHR面试题
你们的组织架构是什么?在这个项目中你觉得最困难的地方是什么?如果再让你做一次你会在哪些方面优化他?
2018年3月28日 阿里巴巴电话一面
当天下午4点左右,阿里巴巴从浙江杭州打来的电话:0571-28223456 ,一开始我没接到,5分钟后我才发现这个电话(提醒:手机一定不要静音,随时保证能接到电话),当我发现后就立即打回去,幸运的是,能够接通,阿里的接线系统还是很智能的,主动提示5分钟前有打我电话,并且自动转接到那个电话。接通之后我解释了一下,面试官语气很和蔼,主动提出给我打过来,我表示要花2分钟拿纸和笔,实际上我还拿了电脑,机智吧!
alibaba后台开发工程师面试题
接下来就是面试内容:
面试主要分为三个部分:基础知识、项目内容和实习经历、应聘岗位相关知识和其他
一:基础知识
面试官会问你主要熟悉的语言,我是学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、实习收获到的知识。
第三部分:问测试相关的知识,这块问得比较浅,比如说平时用什么工具测试
通过猎头推荐,直接进入业务面。两位业务面试官,问了问题都以简历的经历为主,也有一些对于近段时间行业内MKT事件的看法。最后有一轮HRG面试,很常规的hr面试,不要紧张应该都可以通过。
面试官问的面试题:alibabamarketing manager面试题
1.自我介绍
2.为什么选择这个公司
3.为什么选择这个行业
4.简历经历分享
5.未来职业规划
6.有什么问题问面试官
(共2323条) 北京字节跳动科技有限公司
(共2131条) 京东商城
(共2124条) 阿里巴巴
(共31条) 武汉网上网科技有限公司
(共53条) 艺龙旅行网
(共17条) 河南锐之旗信息技术有限公司
(共6条) 中国家用电器研究院
(共5条) 温氏集团
(共5条) 江苏华星会计师事务所
(共5条) 广州赛意信息科技股份有限公司
(共6条) 广州申迪计算机系统有限公司
(共4条) 银雁科技有限公司