创新工场笔试题2014年校园招聘

乐求学 人气:1.77W

时间:2012年9月27日 地点:鼎好大厦10层

创新工场笔试题2014年校园招聘

考试时长:1小时

一, 选择题

1,求z的结果

[cpp] view plaincopyprint?

#define N 3#define Y(n) ((N+1)*n)z = 2*(N+Y(5+1));

解答:48

2,有关多线程,多进程的描述错误的是

A, 子进程获得父进程的数据空间,堆和栈的复制品

B, 线程可以与同进程的其他线程共享数据,但是它拥有自己的栈空间且拥有独立的执行序列

C, 线程执行开销小,但是不利于资源管理和保护

D, 进程适合在SMP机器上进行,而线程则可以跨机器迁移

解答:D

3,

[cpp] view plaincopyprint?

struct s{ int x:3; int y:4; int y:5; double a;}

求sizeof(s)

解答:20或者24;和平台有关。

4,序列{2,1,4,9,8,10,6,20}是某排序算法第二轮排序的结果,则该算法只能是

A快速排序 B冒泡排序

C选择排序 D插入排序

解答:A

5,我们需要监听一个事件状态,让它在状态发生改变时主动发出通知,请问需要哪种设计模式?

A装饰者模式 B建造者模式

C创新工场模式 D观察者模式

解答:D

6,有2012瓶矿泉水,其中有一瓶有毒,请问需要多少只老鼠才能一次性找到有毒的矿泉水?

解答:11只

二, 问答题

1, 有0-n这n+1个数,但是其中丢了一个数,请问如何找出丢了哪个数?

解答:

求这n个数的`sum,然后计算n(n+1)/2-sum可得。

2, 解释

[cpp] view plaincopyprint?

#typedef char (*func)(int,char*)

解答:

定义了一个函数指针的数据类型;

该数据类型可以用来定义函数指针;

定义的函数指针指向的函数的参数为

[cpp] view plaincopyprint?

(int,char*)

返回值为char型。

3, 求输出结果

[cpp] view plaincopyprint?

int a[2][2][3]= { {{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};int *ptr=(int *)(&a+1);printf(“%d %d”, *(int*)(a+1), *(ptr-1));

解答:

12 7

考察多级指针,一定要明确指针指向的是什么,才能知道它加1后跳过了多少字节。

&a是个四级指针,指向的是a这样的数组,所以它加1,就会跳过整个数组。

4,求输出结果

[cpp] view plaincopyprint?

#include

using namespace std;class A{public: virtual void print() { cout << "A::print()" print(); print(a); print(b); print(c);}

解答:

A::print();

B::print();

C::print();

A::print();

B::print();

C::print();

A::print();

A::print();

A::print();

三,算法编程题

1,有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱,求有多少种组合可以组合成n分钱?

解答:

思路

①,四层循环

②,使用回溯法在空间中搜索

代码为思路2:

[cpp] view plaincopyprint?

// : 定义控制台应用程序的入口点。//#include "stdafx.h"#include

#includeusing namespace std;int count=0;int Target=0;int coin[4]={1,2,5,10};int total=0;vectorsolution;void dfs(int index){ if( total == Target ) { count++; cout << count <<":" ; for( int i=0; i<(int)(); i++) { cout << solution<<" "; } cout << total=""> Target ) return; for( int i=index; i<4; i++) { total += coin; _back( coin ); dfs(i); _back(); total -=coin; }}int _tmain(int argc, _TCHAR* argv[]){ while(1) { count=0; cin >> Target; dfs(0); cout << count <

2,马戏团里有个叠罗汉的表演,为了便于美观,下面的人身高和体重都要大于上面的人。现在知道n个演员的身高和体重,请问最多能叠多少层?

解答:

思路:

首先生成一个有向图,用连接矩阵的方式来表示。

map[j]==1表示第i个人上面可以放第j个人。

然后开始对每个人进行深度搜索,这个图中不可能有环。

所以对于每个人来说就是一棵树,搜索树的高度。

再找出最高的高度即是答案。

[cpp] view plaincopyprint?

#include "stdafx.h"#include

#include#include#includeusing namespace std;int N=0;double *weight;double *height;int **map;int maxDepth=0;vectorbestPath;int dfs( int index, vector&path ){ int flag=0; int depth = 0; vectorbestPath; for( int i=0; i depth ) { path = tPath; depth = t; } } } if( flag==0 ) { r(); _back(index); return 1; } else {// path = bestPath; _back(index); return depth+1; }}void CreateMap(){ map = new int*[N]; for( int i=0; i N; height = new double[N]; weight = new double[N]; for( int i=0; i> height; for( int i=0; i> weight; CreateMap(); int depth=0; for(int i=0; idepth ) { bestPath = tPath; depth = t; } } cout << depth <