面试记录

记录下自己的每次面试


2014年7月3日,面试成都好玩123

职位是初级后台开发工程师。


笔试题

1、GetMemory的题目

参见搞死GetMemory

2、用简单字符操作,实现C库中的strcpy函数

注意对两个地址的有效性进行检测

3、static关键字在C/C++中有哪些作用

  1. 在全局变最前加static可对数据进行隐藏,改变其链接性
  2. static的第二个作用是保持变量内容的持久。(static变量中的记忆功能和全局生存期)
  3. static的第三个作用是默认初始化为0(static变量)
  4. static的第四个作用:C++中的类成员声明static(有些地方与以上作用重叠)

4、请用C语方写一个函数,来判断cpu为大端(big_endian)还是小端(little_endian)

大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;如0x1234的低地址存0x12,高地址存0x34
小端模式,是指数据的高位保存在内存的高 地址中,而数 据的低位保存在内存的低地址中,这种存储模式将地址的高低和 数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。如0x1234的低地址存0x34,高地址存0x12
//程序1:
int checkEnd()
{
int i=0x12345678;
char *c=(char *)&i; 
return(*c==0x12)
}
//返回值:大端返回1,小段返回0
//程序2:
int checkEnd()
{
union
{
int a;   //占两字节
char b;  //占一字节
}u;

u.a = 1;  //即0x0001
if (u.b == 1) return 0;
else return 1;
}
//返回值:大端返回1,小段返回0



5、请用递归的方式实现二分查找算法

注意递归时候的mid代替max或min时要进行减一或加一,以避免可能出现的无限递归

面试

项目经历

为何选择转行作程序员

学习能力

手写双向链表的删除操作:我没有考虑周全,写出了核心的,但是表头情况,表尾情况等没考虑

介绍了其后台开发语言为erlang?????


问题总结:

结束主工程师问我有什么问题要提的,我居然说没有。。。然后主工程师自己介绍其项目和业务

应该准备几个问题:项目所用语言、需要知识、项目进展、工作时间、加班情况


华为面试陆续开始

总结一些同学的问题

1、进程与线程的区别

2、宏与内联哪个效率更高,哪个更好

3、printf函数输出是从右至左,所以printf("%d", "%d", *pr, *(++pr))这种坑爹题目别错了

4、volatile:它是被设计用来修饰被不同线程访问和修改的变量一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

mutable 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。

5、排序
6、static的作用
7、如何调用全局变量
8、改错:字符串逆序




2014年8月14日,面试华为

职位是软件研发。

总共两面。

一面:

自我介绍(需要加强,根本没把自己优点强项介绍出来),看了下简历,看到四篇文章。聊下项目,面试官看了下简历,说你还做过java玩了一下啊?我就“恩”了一声,卧槽,这里可以大作文章啊,什么叫就玩了一下啊。抽死自己。根本没给人家介绍android项目是做什么的,自己做了什么事情,面试官估计以为是个SB项目,也没问起。然后让画MFC项目的流程图。这个根本没准备,其实一句话说我画android项目的流程图,这个有准备,会好很多。要准备一个MFC项目的流程图。面试官主动问题MFC程序的功能,我介绍下,并讲下算法以后的应用。问起里面的数据结构,我说以前用链表实现,后来改成数组,速度提升明显。然后就没了。莫名其妙的二面。

等二面中间等了挺长时间,大概半个多小时,心里发虚,一面实在面得烂,什么都没给人家讲出来表达出来,就过了,思考二面要如何吹。

二面:

看了下简历,说我这简历上什么都没有啊。我就说怕写多了您看着烦,就删了很多内容,结果发现删过了。然后他说既然如此那你说说你的项目吧。然后我说起android项目,先从主要功能说起,让面试官知道这是干什么的。然后从没学过java到接下这个项目,加班加点搞项目,到最后讲主要的难点,讲到技术细节(视频录制、压缩、人脸检测、三级联动数据库),总之是这些词把他兴趣调起来了,我说到三级联动的数据库时候,他问什么叫三级联动哦,我就顺手拿出APP给他看,然后从数据库讲到视频录制里面的多线程、人脸检测,看得出来起码他还是没把我当太水的水逼看待。他问起C++的MFC项目我就说主要是与专业的算法有关,就避免了他多问,给他讲了下大体功能。然后聊到业余爱好,我去,这尼玛是我强项啊,然后说到本科的搞活动,说到自己建了社团,与各社团的人打交道,组织市级比赛,参加中国达人秀,面试官又HIGH了,和我聊起达人秀来,说怎么没在电视里看到我们。各种聊,然后我说起高考完给自己定的两个目标,1、找到职业方向;2认识很多人,一路走一路打招呼。他对我两个奇怪的目标很感兴趣,问到为什么要多认识人,我说起高中羞涩,到本科如何克服实现。然后说起职业方向,我说多花了两年,到研究生才找出答案。他可能觉得我在这方面比较有规划,问起如果我进华为有何规划,我说要看岗位,总之是先码几年代码,然后转管理,他问为何要转管理,答说工作几年后这些经验可能用于与技术相关的管理更有价值。他说起其实不转管理,还搞代码,也是一条好出路。问起平时有没有写小程序,我说起写文件分类的小程序。我问了他一个分配岗位的问题。最后他让我用三个词形容华为,我说奋进、团结、第一。

总结:

1、自我介绍要加强,搞出亮点

2、简历太简单,无亮点,没技术。懂多懂少先写上来再说。

3、介绍项目不能只说就是一个android项目,要介绍功能,实现。这样话比较多,人家觉得你有技术,感兴趣的地方他会问起,这样就不会像一面一样冷场了

4、应主动介绍平时写小程序,效果不错,让人觉得喜欢动手喜欢思考。

5、准备下MFC项目的表述与细节问题,看看如何吹合适。比较链表改数组提升了很大的速度,感觉面试官听到这个比较满意。

6、高中毕业时候对自己设的两个目标以后也可以吹吹,效果很好,让人觉得我很有目标,也比较搞笑。

7、设立正确的目标:其实目标可能不是干五年后转管理,而是干五年后,无论哪个岗位,都要有意义而且不能替代,这是二面的锅锅教我的。

8、提前了解企业文化很重要。



时间不详,别人的百度内推电话面

1、自我介绍

2、你的优点,为什么比别人厉害

3、发offer后能来实习三月不

4、对C++熟悉吗?说下malloc与new的区别?

1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

2,对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。 

3,因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。


5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

5、什么是虚继承?什么是重载?怎么识别重载中的两个同名不同参数类型 函数?

虚继承

面试记录_第1张图片

A即为虚基类,通过class B1 : virtual public A来实现虚继承。虚继承为解决多重继承共享相同基类而出现。

在实现D的构造函数时候,除在初始化列表中对B1、B2进行显示初始化外,同时应对虚基类A进行显示初始化。

/*
* 带有数据成员的基类
*/
struct CBaseClass1
{
CBaseClass1( size_t i ) : m_val( i ) {}
size_t m_val;
};
/*
* 虚拟继承体系
*/
struct CSubClassV1 : public virtual CBaseClass1
{
CSubClassV1( size_t i ) : CBaseClass1( i ) {}
};
struct CSubClassV2 : public virtual CBaseClass1
{
CSubClassV2( size_t i ) : CBaseClass1( i ) {}
};
struct CDiamondClass1 : public CSubClassV1, public CSubClassV2
{
CDiamondClass1( size_t i ) : CBaseClass1( i ), CSubClassV1( i ), CSubClassV2( i ) {}
};
struct CDiamondSubClass1 : public CDiamondClass1
{
CDiamondSubClass1( size_t i ) : CBaseClass1( i ), CDiamondClass1( i ) {}
};


重载:

为实现同名不同参函数。在编译时完成,属于编译时多态,或者说不属于多态。参见C++拾遗:多态性

编译器判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与 被调用函数同名的函数。上面的前四个函数都可以成为候选函数(当然可以是多个),而唯有Max ( int , int ) 被排除在外了。
编译器判断重载函数的第二步分为两动作。第一个动作是 编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S ( int )),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的 缺省值(如 S (double , double =1.2 );)第二个动作是根据参数类型的转换规则将被调用的函数 实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行函数,它们分别是S ( int ); S ( double , double )。
如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。
编译器判断重载函数的第三步是从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数 实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。


6、写下memcpy这个函数,用C实现

记得检查参数有效性。


7、给你一个hello world程序,说下它如何编译,从预处理头文件,每步干什么用的。

hello word编译过程

8、有N个数,求出前K个最大数,有什么方法?

1、如果数的范围比较小,可以使用桶排序,全排列好了前K个数也就知道了
2、使用快排的思想,不过基准元素不选择中位数,而选择第K个数
3、数量格外巨大的时候,采用小顶堆或者大顶堆,堆内只留K项。

9、数悉MySQL吗?有哪些存储类型?

以下的文章主要介绍的是MySQL数据类型,MySQL数据库中的5种数据类型是:字符型,文本型,数值型,逻辑型与日期型,以下就是文章的详细内容介绍,希望在你今后的学习中会有所帮助。

MySQL数据类型之一字符型

VARCHAR VS CHAR

VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要。他们都是用来储存字符串长度小于255的字符。

假如你向一个长度为四十个字符的VARCHAR型字段中输入数据Bill Gates。当你以后从这个字段中取出此数据时,你取出的数据其长度为十个字符——字符串Bill Gates的长度。 现在假如你把字符串输入一个长度为四十个字符的CHAR型字段中,那么当你取出数据时,所取出的数据长度将是四十个字符。字符串的后面会被附加多余的空格。

当你建立自己的站点时,你会发现使用VARCHAR型字段要比CHAR型字段方便的多。使用VARCHAR型字段时,你不需要为剪掉你数据中多余的空格而操心。

VARCHAR型字段的另一个突出的好处是它可以比CHAR型字段占用更少的内存和硬盘空间。当你的数据库很大时,这种内存和磁盘空间的节省会变得非常重要

MySQL数据类型之二文本型

TEXT

使用文本型数据,你可以存放超过二十亿个字符的字符串。当你需要存储大串的字符时,应该使用文本型数据。

注意文本型数据没有长度,而上一节中所讲的字符型数据是有长度的。一个文本型字段中的数据通常要么为空,要么很大。

当你从HTML form的多行文本编辑框(TEXTAREA)中收集数据时,你应该把收集的信息存储于文本型字段中。但是,无论何时,只要你能避免使用文本型字段,你就应该不适用它。文本型字段既大且慢,滥用文本型字段会使服务器速度变慢。文本型字段还会吃掉大量的磁盘空间。

一旦你向文本型字段中输入了任何数据(甚至是空值),就会有2K的空间被自动分配给该数据。除非删除该记录,否则你无法收回这部分存储空间。

MySQL数据类型之三数值型

SQL支持许多种不同的数值型数据。你可以存储整数 INT 、小数 NUMERIC、和钱数 MONEY。

INT VS SMALLINT VS TINYINT

他们的区别只是字符长度:

INT型数据的表数范围是从-2,147,483,647到2,147,483,647的整数

SMALLINT 型数据可以存储从-32768到32768的整数

TINYINT 型的字段只能存储从0到255的整数,不能用来储存负数

通常,为了节省空间,应该尽可能的使用最小的整型数据。一个TINYINT型数据只占用一个字节;一个INT型数据占用四个字节。这看起来似乎差别不大,但是在比较大的表中,字节数的增长是很快的。另一方面,一旦你已经创建了一个字段,要修改它是很困难的。因此,为安全起见,你应该预测以下,一个字段所需要存储的数值最大有可能是多大,然后选择适当的数据类型。

MUNERIC

为了能对字段所存放的数据有更多的控制,你可以使用NUMERIC型数据来同时表示一个数的整数部分和小数部分。NUMERIC型数据使你能表示非常大的数——比INT型数据要大得多。一个NUMERIC型字段可以存储从-1038到1038范围内的数。NUMERIC型数据还使你能表示有小数部分的数。例如,你可以在NUMERIC型字段中存储小数3.14。

当定义一个NUMERIC型字段时,你需要同时指定整数部分的大小和小数部分的大小。如:MUNERIC(23,0)

一个 NUMERIC型数据的整数部分最大只能有28位,小数部分的位数必须小于或等于整数部分的位数,小数部分可以是零。

MONEY VS SMALLMONEY

你可以使用 INT型或NUMERIC型数据来存储钱数。但是,专门有另外两种数据类型用于此目的。如果你希望你的网点能挣很多钱,你可以使用MONEY型数据。如果你的野心不大,你可以使用SMALLMONEY型数据。MONEY型数据可以存储从-922,337,203,685,477.5808到922,337,203,685,477.5807的钱数。如果你需要存储比这还大的金额,你可以使用NUMERIC型数据。

SMALLMONEY型数据只能存储从-214,748.3648到214,748.3647 的钱数。同样,如果可以的话,你应该用SMALLMONEY型来代替MONEY型数据,以节省空间。

MySQL数据类型之四逻辑型

BIT

如果你使用复选框( CHECKBOX)从网页中搜集信息,你可以把此信息存储在BIT型字段中。BIT型字段只能取两个值:0或1。

当心,在你创建好一个表之后,你不能向表中添加 BIT型字段。如果你打算在一个表中包含BIT型字段,你必须在创建表时完成。

MySQL数据类型之五日期型

DATETIME VS SMALLDATETIME

一个 DATETIME型的字段可以存储的日期范围是从1753年1月1日第一毫秒到9999年12月31日最后一毫秒。

如果你不需要覆盖这么大范围的日期和时间,你可以使用SMALLDATETIME型数据。它与DATETIME型数据同样使用,只不过它能表示的日期和时间范围比DATETIME型数据小,而且不如DATETIME型数据精确。一个SMALLDATETIME型的字段能够存储从1900年1月1日到2079年6月6日的日期,它只能精确到秒。

DATETIME型字段在你输入日期和时间之前并不包含实际的数据,认识这一点是重要的。

10、说一说符号表的作用。

符号表在编译程序工作的过程中需要不断收集、记录和使用源程序中一些语法符号的类型和特征等相关信息。这些信息一般以表格形式存储于系统中。如常数表、变量名表、数组名表、过程名表、标号表等等,统称为符号表。对于符号表组织、构造和管理方法的好坏会直接影响编译系统的运行效率。

11、熟悉网络变编程吗?

12、你还有什么问题吗?

2014年9月3日,电话面试品果科技(CAMERA360)

1、讲解下项目中安卓视频录制的过程。

2、讲解下项目中遇到的兼容性问题

3、了解安卓底层吗?

4、对于安卓的消息机制了解吗?

我居然回答说不太了解,我去!!!!

Android消息处理机制


5、讲解下安卓四大组件

Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器。

6、讲下java的内层回收机制,GC是立即执行的吗?

Java 内存区域和GC机制

7、重写与重载

8、如何做线程同步

9、说说泛型

10、了解网络基础不,说说http操作

总结:

这是一次无准备之战,问到的许多java、安卓问题其实我都知道,写过,但是回答的时候总是回答不太清楚,幻想着把面试官往C++上面带,结果就如此水水的挂在了一面上面。需要总结下java基础知识和安卓基础知识。
加油!

你可能感兴趣的:(面试记录)