2012 年 9 月 15 日搜狐校园招聘会笔试试题
一、不定项选择题
1、以下程序的打印结果是()
[cpp] view plaincopyprint?
1. #include
2. using
namespace
std;
3.
4. void swap_int(int
a
,
int
b)
5. {
6.
7.
8.
9. }
10.
int
temp
=
a;
a
b
=
=
b;
temp;
11. void swap_str(char*
a
,
char*
b)
12. {
13.
14.
15.
16. }
17.
char*
temp
=
a;
a
b
=
=
b;
temp;
18. int
main(void)
19. {
20.
21.
22.
23.
24.
25.
26.
27.
28.
29. }
int
int
a
b
=
=
10;
5;
char*
str_a
char*
str_b
=
=
"hello
world";
"world
hello";
swap_int(a
,
b);
swap_str(str_a
,
str_b);
printf("%d
%d
%s
%s\n",
a
,
b
,
str_a
,
str_b);
return
0;
A、10 5 hello world world hello
B、10 5 world hello hello world
C、5 10 hello world world hello
D、5 10 hello world world hello
2、以下程序打印的两个字符分别是(A)
[cpp] view plaincopyprint?
1. typedef
struct
object
object;
2. struct
object
3. {
4.
5. };
6.
char
data[3];
7. int
main(void)
8. {
9.
10.
11.
12.
13.
};
ur+2));
14.
15.
16. }
object
obj_array[3] =
{
{'a','b','c'},
{'d','e','f'},
{'g','h','i'}
object*
cur =
obj_array;
printf("%c
%c\n",
*(char*)((char *)(cur)+2)
,
*(char*)(c
return
0;
A、c g
g c
B、b d
C、g g
D、
3、C/C++语言:请问在 64 位平台机器下 sizeof(string_a) , sizeof(string_b)大小分别
是(A)
[cpp] view plaincopyprint?
1. char
*string_a
=
(char
*)malloc(100*sizeof(char));
2. char
string_b[100];
A、8 100
B、100 8
C、100 100
D、8 8
4、假设二叉排序树的定义是:1、若它的左子树不为空,则左子树所有节点均小于它的根节
点的值;2、若右子树不为空,则右子树所有节点的值均大于根节点的值;3、它的左右子树
也分别为二叉排序树。下列哪种遍历之后得到一个递增有序数列(B)
A、前序遍历
B、中序遍历
C、后序遍历
D、广度遍历
5、往一个栈顺序 push 下列元素:ABCDE,其 pop 可能的顺序,下列不正确的是(C)
A、BACDE
B、ACDBE
C、AEBCD
D、AEDCB
6、1100|1010 , 1001^1001 , 1001&1100 分别为(A)
A、1110
0000
C、1110
1001
1000
0101
B、1000
1001
1000
D、1000
1001
1000
7、二叉树是一种树形结构,每个节点至多有两颗子树,下列一定是二叉树的是(AC)
A、红黑树
B、B 树
C、AVL 树
D、B+树
8、int A[2][3] = {1,2,3,4,5,6}; , 则 A[1][0]和*(*(A+1)+1)的值分别是(A)
A、4 5
B、4 3
C、3 5
D、3 4
9、序列 16 14 10 8 7 9 3 2 4 1 的说法下面哪一个正确(A)
A、大顶堆
B、小顶堆 C、不是堆
D、二叉排序树
10、输入若已经是排好序的,下列排序算法最快的是(A)
A、插入排序
B、Shell 排序
C、合并排序
D、快速排序
11、一种既有利于短作业又兼顾长期作业的调度方式是(D)
A、先来先服务
B、均衡调度
C、最短作业优先
D、最高响
应比优先
12、同一进程下的线程可以共享(B)
A、stack
thread ID
B、data section
C、register set
D、
13、系统中的“颠簸”是由(B)引起的。
A、内存容量不足
B、缺页率高
C、交换信息量大
D、
缺页率反馈模型不正确
14、8 瓶酒一瓶有毒,用人测试。每次测试结果 8 小时后才会得出,而你只有 8 个小时的时
间。问最少需要(B)人测试?
A、2
B、3
C、4
D、6
是3个人,如果你学过数的2进制编码,就容易说了:
8瓶酒的编码如下:
0: 000
1: 001
2: 010
3: 011
4: 100
5: 101
6: 110
7: 111
3个人分别喝3个位上为1的编码,所以:
第一个:1,3,5,7
第二个:2,3,6,7
第三个:4,5,6,7
把中毒的人的位填1的二进制数,就是毒酒的编号。
15、下列关于网络编程错误的是(AB)
A、TCP 建立和关闭连接都只需要三次握手
B、UDP 是可靠服务
C、主动关闭的一端会出现 TIME_WAIT 状态
D、服务端编程会调用 listen(),客户端也可以调用 bind()
16、进程间通讯有哪几种形式(ABCD)
A、Socket
B、Pipe
C、Shared memory
D、Signal
17、TCP/UDP 下面正确的是(AC)
A、TCP provide connection-oriented,byte-stream service;
B、Both TCP and UDP provide reliability service;
C、TCP also provides flow control;
D、Both TCP and UDP provide retransmission mechanism;
18、分布式系统设计包括(ABCDE)
A、容错,design for fault
B、多数据中心的数据一致性
C、数据/服务可靠性
D、可扩展性
E、要满足 ACID 特性
19、10 个不同的球,放入 3 个不同的桶内,共有(C)种方法。 3^10
A、1000
B、720
C、59049
D、360
20、87 的 100 次幂除以 7 的余数是多少(D)
A、1
B、2
C、3
D、4
二、简答题:
1、
(1)请描述进程和线程的区别?
(2)多线程程序有什么优点、缺点?
(2)多进程程序有什么优点、缺点?与多线程相比,有何区别?
2、编程题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现
[cpp] view plaincopyprint?
1. typedef
struct
node
LinkNode;
2. struct
node
3. {
4.
5.
6. };
int
data;
LinkNode*
next;
// 返回新链表头节点
LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)
[cpp] view plaincopyprint?
1. // 返回新链表头节点
2. LinkNode *reverse_link(LinkNode
*head)
3. {
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
if(head
==
NULL)
return
NULL;
LinkNode *prev
,
*curr
,
*reverse_head
,
*temp;
prev =
NULL
,
curr
=
head;
while(curr->next)
{
}
temp =
curr->next;
curr->next
=
prev;
prev =
curr;
curr =
temp;
curr->next
=
prev;
reverse_head =
curr;
return
reverse_head;
17.
18. }
19.
20. LinkNode *reverse_link_recursive(LinkNode
*head)
21. {
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
if(head
==
NULL)
return
NULL;
LinkNode *curr
,
*reverse_head
,
*temp;
if(head->next
==
NULL)
// 链表中只有一个节点,逆转后
的头指针不变
else
{
指针
return
head;
curr =
head;
temp =
head->next;
//
temp 为(a2,...an)的头
reverse_head =
reverse_link_recursive(temp);
/
/ 逆转链表(a2,...an),并返回逆转后的头指针
temp->next
curr->next
=
=
curr;
NULL;
// 将 a1 链接在 a2 之后
}
return
reverse_head;
//
(a2,...an)逆转链表的头指
针即为(a1,a2,...an)逆转链表的头指针
36. }
3、给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序
列。
如:1、-2、3、5、-4、6 连续序列 3、5、-4、6 的和最大。
如元素全为负数,则最大的和为 0,即一个也没有选。
/*
array[]
输入数组
n
*/
数组元素个数
返回最大序列和
int find_max_sum(int array[] , int n)
[cpp] view plaincopyprint?
1. int
find_max_sum(int
array[]
,
int
n)
2. {
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. }
,
max
,
sum;
int
sum
i
=
max
for(i
=
1
=
;
array[0];
i
<
n
;
++i)
{
}
if(sum
<
0)
sum
=
array[i];
else
sum
+=
array[i];
if(sum
>
max)
max
=
sum;
if(max
<
0)
max
=
0;
return
max;
三、设计题
1、设计一个图片存储系统:假设有一个相册系统,每个用户不限制上传的图片数目,每张
相片压缩后都在 1M 以内,需求如下:
(1)文件数量太大,采用传统的文件系统存储导致目录系统非常臃肿,访问速度变得缓慢;
(2)单机存储容量已经远远不能承载所有的文件;
(3)上传之后,用户只有读取操作和删除操作,不支持修改,整个系统读写比例 10:1
思路:可以使用分布式的文件系统,觉得 hadoop 的 HDFS 很符合要求,这是 hadoop 对
googleGDFS 的实现。