面试笔试经验技巧篇
想找到一份程序员的工作,没有技术显然是不行的,但只有技术也是不够的。
面试笔试经验技巧篇主要针对程序员面试笔试中遇到的 13 个常见问题进行深度
解析,并且结合实际情景,给出了一个较为合理的参考答案供读者学习与应用。
掌握这 13 个问题的应答技巧,对于求职者大有裨益。
真 题 篇
真题详解篇
对于求职者而言,求职季堪比个“赶场季”,一天少则几家、十几家企业入校招聘,多则几
十家、上百家企业招兵买马,企业多,选择自然也多,这固然是一件好事情,但由于招聘企
业实在是太多了,自然会导致另外一个问题的发生——同一天企业扎堆,且都是自己心仪或
欣赏的知名企业。如果不能够提前掌握企业的宣讲时间、地点,则很容易迟到或错过。但有
时候即使掌握了宣讲时间、笔试时间、面试时间,还是有可能错过,为什么呢?时间冲突,
人不是神仙,不可能具有分身术,也不可能同一时间做两件不同的事情,所以,就必须有所
取舍。
到底该如何取舍呢?到底该如何应对这种时间冲突的问题呢?在此,编者将自己的一些
想法经验与分享出来,以供读者参考。
1)如果多家心仪企业的校园宣讲时间发生冲突(前提是只宣讲、不笔试),此时最好的解决
方法是和同学或朋友商量好,各去一家,然后大家进行信息共享。2)如果多家心仪企业的笔试时间发生冲突,此时只能选择其一,毕竟企业的笔试时间都是
考虑到了成百上千人的安排,需要提前安排考场、考务人员、阅卷人员等,不可能为了一个
人而轻易改变。所以,最好选择自己更有兴趣的企业参加笔试。
3)如果多家自己心仪企业的面试时间发生冲突,求职者不要轻易放弃。对于面试官而言,
面试任何人都是一样的,因为面试官谁都不认识。而面试时间也是比较灵活的,一般可以通
过电话协商。求职者可以与相关工作人员(一般是企业的人力资源师)进行沟通,给出不能
参加面试的原因,让其调整时间。但一般要接到面试通知后的第一时间联系相关工作人员变
更时间。
那如果多家企业的校园宣讲时间、笔试时间、面试时间发生冲突,到底是去宣讲会,还是去
笔试,或是去面试呢?大原则是选择自己最有兴趣的企业。但也要灵活处理,如果仅仅只是
宣讲而不涉及笔试,则完全可以不去,可寻求同学或是朋友的帮忙,回来后信息共享即可。
如果可以协调面试时间,那就打电话给相关工作人员,换个不冲突的时间去面试,笔试一般
时间比较固定,需要协调的事情很多,所以调整时间的可能性也不大,此时如果协调得当,
基本能够保证不放弃任何一个机会。
正如世界上没有能够包治百病的药物一样,以上这些建议在应用时,很多情况下也做不到全
盘兼顾,当必须进行多选一时,求职者就要对此进行评估了,评估的项目可以包括对企业的
中意程度、获得录用通知的概率、去工作的可能性等。评估的结果往往具有很强的参考性,
求职者依据评估结果做出的选择一般也会比较合理。
真 题 篇
真题篇主要列举了 17 套来自于著名 IT 企业的面试笔试真题,这些企业是行
业的标杆,代表了行业的最高水准,而它们所出的面试笔试真题不但难易适中,
覆盖面广(包括语言基础、链表、算法、海量数据处理等内容),而且具有非常
好的区分度,代表性非常强,是历年来程序员面试笔试中的必考项或者常考项。
越来越多的中小企业开始从中选取或者加以借鉴,以此作为面试笔试题。
某知名互联网下载服务提供商软件工程师
笔试题 一、单选题
1.定义有变量 int i=0; int a=i++; int b=++a; int c=a+b,那么表达式 a?b:c 的值为( )。
A.0 B.1 C.2 D.3
2.在 32 位计算环境下,定义有语句 int *p=new int[10],那么 sizeof(p)的值为( )。
A.4 B.10 C.40 D.8
3.在 32 位计算环境下,定义有语句 char str[] = "abcde",那么 sizeof(str)的值为( )。
A.1 B.4 C.5 D.6
4.定义有函数 int func(int i),它的实现如下:
int func(int i)
{
if(i > 1)
return i*func(i-1);
else
return 1;
}
那么调用 f(5)方法的返回值为( )阶乘计算。
A.5 B.15 C.20 D.120
5.以下关于类的描述中,正确的是( )。
A.每个类都有一个无参数的构造函数 B.每个类都有一个拷贝构造函数
C.每个类能有多个构造函数 D.每个类能有多个析构函数
6.用关键字 class 定义的类,其成员默认的访问属性为( )。
A.private B.protected C.public D.无定义
7.类的成员有三种访问属性,分别是 public、protected 和 private,子类能够访问的成员是
( )。
A.都能访问 B.public 和 protected
C.public 和 private D.protected 和 private
8.对一个已经排好序的数组进行查找,时间复杂度为( )。
A.O(n) B.O(logn) C.O(nlogn) D.O(1)
9.有以下二叉树:
对其进行后序遍历的结果是( )。
A.丙乙丁甲戊己 B.甲乙丙丁戊己
C.丙丁乙己戊甲 D.丙丁己乙戊甲
10.有以下代码:A *pa = new A[10];
delete pa;
则类 A 的构造函数和析构函数分别执行了( )次。
A.1,1 B.10,10 C.1,10 D.10,1
11.有以下代码:
class A { public: ~A(); }; A::~A() { printf("delete A "); }
class B :public A { public: ~B(); }; B::~B() { printf("delete B "); }
那么执行以下代码:
A *pa = new B();
delete pa;
程序的输出结果是( )。
A.delete A B.delete B C.delete B delete A D.delete A delete B
12.文件长度是一个大于 0 的整数,用变量 unsigned file_length 来表示,把文件分成块,每
块的长度也是一个大于 0 的整数,用变量 unsigned block_length 来表示,则文件被分成的块
数为( )。
A.file_length/block_length
B.file_length/block_length+1
C.(file_length+block_length-1)/block_length
D.((file_length-1)/block_length+1
13.定义有整数 int i = 0xFE78DA45,int k = 0xAC3189B2,则 i^k 的值为( )。
A.0x524953f7 B.0xAC308800
C.0xFE79DBF7 D.0X0000001
14.有以下代码:
class parent
{
public:
virtual void output();
};
void parent::output()
{
printf("parent");
}
class son : public parent
{
public:
virtual void output();
};
void son::output()
{
printf("son");
}
则以下程序段:
son s;
::memset(&s , 0 , sizeof(s));parent& p = s;
p.output();
其执行结果是( )。
A.parent B.son
C.sonparent D.没有输出结果,程序运行出错
15.函数的局部变量所需的存储空间是在( )分配的。
A.进程的数据段 B.进程的栈上
C.进程的堆上 D.以上都可以
16.以下 STL 的容器存放的数据中,肯定是排好序的是( )。
A.vector B.deque C.list D.map
17.有定义语句:int a[][3]={{1},{3,2},{6,7,8},{9}},那么 a[2][1]的值是( )。
A.3 B.6 C.2 D.7
18.以下关于头文件的描述中,正确的是( )。
A.#include,编译器寻找头文件时,会从当前编译的源文件所在的目录中
找
B.#include"filename.h",编译器寻找头文件时,会从通过编译选项指定的目录中找
C.多个源文件同时用到的全局整数变量,它的声明和定义都放在头文件中,是好的编
程习惯
D.在大型项目开发中,把所有自定义的数据类型、全局变量、函数声明都放在一个头
文件中,各个源文件都只需要包含这个头文件即可,省去了要写很多#include 语句的麻烦,
是好的编程习惯
19.某棵完全二叉树上有 699 个结点,则该二叉树的叶子结点数为( )。
A.349 B.350 C.188 D.187
20.一个指向字符串的指针 char *p_str,要把字符串中第四个字符的值改为'a',正确的做法
是( )。
A.p_str[3]='a' B.*(ptr+3)= 'a' C.p_str[4]= 'a' D.*(ptr+4)= 'a'
21.下列关于内联函数的描述中,正确的是( )。
A.类的私有成员函数不能作为内联函数
B.在所有类说明中,内部定义的成员函数都是内联函数
C.类的保护成员函数不能作为内联函数
D.使用内联函数的地方会在运行阶段用内联函数体进行替换
二、多选题
1.已知一段文本有 1382 个字符,使用了 1382 个字节进行存储,这段文本全部是由 a、b、
c、d、e 这 5 个字符组成,其中,字符 a 出现了 354 次,字符 b 出现了 483 次,字符 c 出现
了 227 次,字符 d 出现了 96 次,字符 e 出现了 232 次,如果对这 5 个字符使用赫夫曼
(Huffman)算法进行编码,则以下说法中,正确的是( )。
A.使用赫夫曼算法编码后,用编码值来存储这段文本将花费最少的存储空间
B.使用赫夫曼算法进行编码,a、b、c、d、e 这 5 个字符对应的编码值是唯一确定的
C.使用赫夫曼算法进行编码,a、b、c、d、e 这 5 个字符对应的编码值可以有多套,但
每个字符编码的位(bit)数是确定的
D.字符 b 的赫夫曼编码值位数应该最短,字符 d 的赫夫曼编码值位数应该最长
2.已知 double d = 3.2,int n = 3,那么下列表达式中,不合法的是( )。
A.d 2 B.d/n C.!d && (n-3) D.(d-0.2)|n
3.下列对于循环知识的描述中,正确的是( )。 A.while 循环语句的循环体至少执行一次
B.do-while 循环可以写成 while 循环的格式
C.continue 语句可以出现在各种循环体中
D.break 语句不可以出现在循环体内
4.下列模板声明中,非法的是( )。
A.templateclass C1;
B.templateclass C2;
C.templateclass C3{};
D.templateclass C4{};
5.在使用浏览器打开一个网页的过程中,浏览器会使用的网络协议包括( )。
A.DNS B.TCP C.HTTP D.Telnet
6.下列选项中,属于构造散列函数的方法是( )。
A.直接定址法 B.数字分析法 C.除留余数法 D.平方取中法
7.拷贝构造函数的特点是( )。
A.该函数名同类名,也是一种构造函数,该函数返回自身引用
B.该函数只有一个参数,必须是对某个对象的引用
C.每个类都必须有一个拷贝初始化构造函数,如果类中没有说明拷贝构造函数,那么编
译器系统会自动生成一个默认的拷贝构造函数,作为该类的保护成员
D.拷贝初始化构造函数的作用是将一个已知对象的数据成员值复制给正在创建的另一
个同类的对象
8.下列关于虚函数的描述中,正确的是( )。
A.在构造函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效
B.在析构函数中调用类自己的虚函数,虚函数的动态绑定机制还会生效
C.静态函数不可以是虚函数
D.虚函数可以声明为 inline
9.下列对函数 double add(int a , int b)进行重载的描述中,正确的是( )。
A.int add(int a ,int b ,int c) B.int add(double a , double b)
C.double add(double a , double b) D.int add(int a , int b)
三、填空题
1.以下代码用于计算 100 以内的素数的个数,请把相应的空填上(空 1~空 4)。
struct prime_number_node { int prime_number; prime_number_node* next; }; int calc_prime_number() { prime_number_node* list_head = new prime_number_node(); list_head->next = NULL; list_head->prime_number = 2; prime_number_node* list_tail = list_head; for (int number = 3; number<100;number++) {intremainder;prime_number_node*cur_node_ptr=list_head;while(cur_node_ptr!=NULL){remainder=number%cur_node_ptr->prime_number; if (remainder == 0) { //1 } else { //2 } } if (remainder != 0) { prime_number_node* new_node_ptr = new prime_number_node(); new_node_ptr->prime_number = number; new_node_ptr->next = NULL; list_tail->next = new_node_ptr; //3 } } int result = 0; while (list_head != NULL) { result++; prime_number_node* temp_ptr = list_head; list_head = list_head->next; //4 } return result; }
2.已知集合 A 和集合 B 的元素分别用不含头结点的单链表存储,函数 difference()用于求解
集合 A 与集合 B 的差集,运算结果保存在集合 A 的单链表中。例如,若集合
A={5,10,20,15,25,30},集合 B={5,15,35,25},完成计算后 A={10,20,30}。
链表结点的结构类型定义如下:
struct node
{
int elem;
node* next;
};
void difference(node** LA, node* LB)
{
node *pa, *pb, *pre, *q;pre = NULL;
; //1
while (pa)
{
pb = LB;
while () //2
pb = pb->next;
if () //3
{
if (!pre)
*LA = ; //4
else
= pa->next; //5
q = pa;
pa = pa->next;
free(q);
}
else
{
; //6
pa = pa->next;
}
}
}
1、2、3、4、5、6 这六行代码依次为( )。
真题 2 某知名监控产品供应商和解决方案服务商
软件工程师笔试题
一、单选题
1.静态局部变量存储在进程的( )。
A.栈区 B.寄存器区 C.代码区 D.全局区
2.在 C 语言中,有数组定义如下:char array[]="China",则数组 array[]所占用的空间为( )。
A.4 个字节 B.5 个字节 C.6 个字节 D.7 个字节
3.执行 C 语言代码“int a=1; int b=0; int c=0; int d=(++a)*(c=1);”后,变量 a、b、c、d 的值分
别为( )。
A.2,0,1,2 B.1,0,1,1 C.2,0,1,1 D.2,0,0,2
4.有一个变量 int a=0,两个线程同时对其进行+1 操作,每个线程加 100 次,不加锁,最后
变量 a 的值是( )。
A.200 B.≤200 C.≥200 D.都有可能
5.HTTPS 采用( )实现安全网站访问。
A.SSL B.IPsec C.PGP D.SET
6.某主机的 IP 地址为 202.117.131.12/20,其子网掩码是( )。
A.255.255.248.0 B.255.255.240.0
C.255.255.252.0 D.255.255.255.4
7.下列选项中,不属于网络安全控制技术的是( )。 A.防火墙技术 B.访问控制技术
C.入侵检测技术 D.差错控制技术
8.多媒体技术是指以计算机为平台综合处理多种媒体信息,其中“媒体”主要指的是( )。
A.文字和图像 B.各种信息的编码
C.音频和视频 D.承载信息的载体
9.一幅彩色图像(RGB),分辨率为 256×512,每一种颜色用 8 bit 表示,则该彩色图像为
( )bit。
A.256×512×8 B.256×512×3×8 C.256×512×3/8 D.256×512×3
10. 计算机通过传声器接口(MIC)收到的信号是( )。
A.音频数字信号 B.音频模拟信号
C.量化信号 D.采样信号
11.当在 CPU 内存之间进行地址转换时,( )将地址从虚拟(逻辑)地址空间映射到物
理地址空间。
A.TCB B.MMU C.CACHE D.DMA
12.RS485 最少有( )根数据信息号。
A.2 B.6 C.8 D.16
13.程序开发中,编译器的主要作用是( )。
A.代码编辑功能 B.检查代码规范性
C.分析代码中的问题 D.完成源语言与目标语言的转换
14.下列关于实时操作系统(RTOS)的任务调度器描述中,正确的是( )。
A.任务之间的公平性是最重要的调度目标
B.大多数 RTOS 调度算法都是可抢占式(可剥夺式)的
C.RTOS 调度器都采用了基于时间片轮转的调度算法
D.RTOS 调度算法只是一种静态优先级调度算法
二、填空题
1.当 C++语言调用 C 语言库时,需要添加( )。
2.sprintf 函数和 snprintf 函数的区别是( )。
3.定义有 a=1, b=2, c=3, d=4,那么表达式 a的值是( )。
4.有如下代码:
#include
int main()
{
unsigned int a = 6;
int b = -20;
(a + b > 6) ? printf(">6") : printf("<=6");
return 0;
}
则这段代码的输出结果是( )。
真题 3 某知名搜索引擎提供商软件工程师笔试题
一、简答题
1.进程和线程的区别是什么?
2.存储过程是什么?它有哪些优点?
3.static 关键字的作用是什么?static 全局变量与普通全局变量的区别是什么?static 局部变
量与普通变量的区别是什么?static 函数与普通函数的区别是什么?
二、算法与程序设计题
1.实现内存拷贝函数 memcpy。
2.在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递
增的顺序排序。请实现一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含
有该整数。
例如,下面的二维数组就是符合这种约束条件的。如果在这个数组中查找数字 7,则返回
true;如果查找数字 5,由于数组中不含有该数字,则返回 false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
3.定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数。在该栈
中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
三、系统设计题
微博中的 url 往往很长,发送前要转化为 tinyurl。
1)url 如何转为 tinyurl 编码?
2)如果用户输入一个已经转换过的 url,如何快速定位到已经生成了的 tinyurl?
3)如果数据为 10 亿条,需要 10 个 tinyurl 服务器,那么如何设计?
真题详解篇











网友评论