您的位置:首页 > 其它

2014.03.16 网易游戏TTT计划实习生笔试题

2014-06-09 08:33 316 查看
转载:/article/1617222.html

注:这份试题是本人事后回忆的,题目可能会有出入,且给出的答案不一定正确,仅供参考,欢迎指正错误。

前面这些题是试卷的第I部分,试卷上面说第一部分达不到基本线直接淘汰,最终排名主要看II卷



I 卷 基础题

1.求1111+2*1111+....+1111*1111对7求余的结果。

n(n+1)/2, 即556*1111*1111对7求余,每个数分别对7求余,余数相乘后对7求余最后算的结果是5.

2.,某点p(x,y,z),绕Y轴旋转的角度为

,求三维旋转矩阵。



3.如下图,A, B, C, D, E灯泡坏掉的概率分别为0.2, 0.3, 0.4, 0.5,0.6,求此电路不通的概率




AB路坏的概率:0.2*0.7 + 0.8*0.3 + 0.2*0.3 = 0.44

CDE路坏的概率:0.4*0.5 + 0.6 – 0.4*0.5*0.6 = 0.68

总的概率 0.44 * 0.68 =0.2992

4.f(0)=0,f(1)=1,f(n)=(f(n-1)+f(n-2))mod5 求f(2013);

周期为20,f(2013)=f(13)=3

5.二分查找的时间复杂度O(logn),堆排序的空间复杂度O(1)。快排的时间复杂度O(nlogn)。

6.堆和栈的区别。(malloc/new的内存在堆分配,局部非静态变量在栈中分配内存)

7.下面代码的输出结果:(vs2008 测试是25 82,其实这种题比较坑爹)

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

#define mul(a) (a)*(a)

int main(void)

{

int a = 5, b, c;

b = mul(a++);

c = mul(++a);

if(!a && c++)

b++;

else

c++;

printf("%d %d", b, c);

}

8.定义一个宏,若满足条件则终止程序并报告错误文件名和行数,并有以下调用:

if(x>=0 && y>=0)

assert(x+y);

else

assert(x-y);

如果按照以下格式写宏,会有什么问题:

#define assert(e) if(!e) assert_error(__FILE__, __LINE__)

//边际效应,会变成!x + y,而且原来的else会跟这里的if(!e)匹配

如果按照以下格式写,又会有什么问题:

#define assert(e) {if(!e) assert_error(__FILE__, __LINE__);}

//错误仍在且出现语法错误,编译错误,花括号外面多了个分号

怎样改才是对的?#define assert(e); {if(!(e)) assert_error(__FILE__, __LINE__);}

或者 #define assert(e) ((e) || assert_error(__FILE__, __LINE__);)

10.已知是低端保存,32位机器,求输出结果.答案应该是8 2

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

struct data

{

int a;

unsigned short b;

}

int main(void)

{

data mData;

mData.b = 0x0102;

char *p = (char *)&mData;

printf("%d %d", sizeof(mData), (int) (*(p + 4)));

}

11.下面程序输出是什么? ~Base

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include <iostream>

using namespace std;

class Base

{

public:

~Base()

{

cout << "~Base" << endl;

}

};

class Dri: public Base

{

public:

~Dri()

{

cout << "~Dri" << endl;

}

};

int main()

{

Base *b = new Dri();

delete b;

return 0;

}

12.下面调用fork()总共生成多少个进程,打印几个'-' 4 6 (注:如果没有fflush,将输出8个'-')

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

#include <unistd.h>

int main()

{

int i;

for(i = 0; i < 2; ++i)

{

fork();

printf("-");

fflush(stdout);

}

return 0;

}
13.此代码有什么用?./a.out >outfile 2>&1

将a.out程序运行的标准输出和标准错误输出重定向到outfile

12.一分钟的音乐,采用14400的采样率,双声道,每个点16bit,问音乐的大小。14400*2*16*60/8=3456000B

II卷 程序应用与设计

1.程序改错

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

class obj

{

public:

obj()

{

m = 0;

data = new int[100];

}

obj(const &t)

{

m = t.m;

data = new int[100];

memcpy((char *)data, (char *)t.data, sizeof(int) * 100);

}

int squ(volatile int *p) //表示对*p的赋值,将全部保留不做优化,volatile摆放的位置不同导致的不同含义与const类似

{

int tmp = *p;

return tmp * tmp;

}

~obj()

{

if(data)

delete[] data;

}

void add()

{

m++;

}

private:

int m;

int *data;

};

int main()

{

obj o1;

obj o2 = o1;

return 0;

}

2.两个题可以选一个。

a.写一个strcmp函数

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

//字符串比较

int strcmp(const char *s, const char *t)

{

assert(s != NULL && t != NULL);

while(*s && *t && *s == *t)

{

++ s;

++ t;

}

return (*s - *t);

}

b.约瑟夫环的问题(直接没看题目)。

3.纸牌游戏,随便抽五张牌,A代表1,2-10还是2-10,J,Q,K表示11,12,13, 大小王可以当任何一张。判断5张牌是不是顺子。http://zhedahht.blog.163.com/blog/static/25411174200951262930831

把数组排序,统计数组中0的个数,统计排序之后的数组相邻数字之间的空缺总数。如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。换成扑克牌的描述方式,就是如果一副牌里含有对子,则不可能是顺子。基于这个思路,我们可以写出如下的代码:

C++ Code
1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

// Determine whether numbers in an array are continuous

// Parameters: numbers: an array, each number in the array is between

// 0 and maxNumber. 0 can be treeted as any number between

// 1 and maxNumber

// maxNumber: the maximum number in the array numbers

bool IsContinuous(std::vector<int> numbers, int maxNumber)

{

if(numbers.size() == 0 || maxNumber <= 0)

return false;

// Sort the array numbers.

std::sort(numbers.begin(), numbers.end());

int numberOfZero = 0;

int numberOfGap = 0;

// how many 0s in the array?

std::vector<int>::iterator smallerNumber = numbers.begin();

while(smallerNumber != numbers.end() && *smallerNumber == 0)

{

numberOfZero++;

++smallerNumber;

}

// get the total gaps between all adjacent two numbers

std::vector<int>::iterator biggerNumber = smallerNumber + 1;

while(biggerNumber < numbers.end())

{

// if any non-zero number appears more than once in the array,

// the array can't be continuous

if(*biggerNumber == *smallerNumber)

return false;

numberOfGap += *biggerNumber - *smallerNumber - 1;

smallerNumber = biggerNumber;

++biggerNumber;

}

return (numberOfGap > numberOfZero) ? false : true;

}
或者排除法:

1)确认5张牌中除了0,其余数字没有重复的(可以用表统计的方法且记录0的个数);

2)满足这样的逻辑:(max,min分别代表5张牌中的除0以外的最大值最小值)

如果没有0,则max-min=4,则为顺子,否则不是

如果有一个0,则max-min=4或者3,则为顺子,否则不是

如果有两个0,则max-min=4或者3或者2,则为顺子,否则不是

4.写一个内存管理存储器,已知学生的学籍id,姓名,性别,省份,个性签名等信息。

要求:用C++;Linux环境下;至少建立两个索引加快查询;线程安全;高效的增删改查。

5. 一段关于redis KEYS 命令英文简介,说明使用KEYS这个命令会导致什么问题和有什么解决方法。

后记:本人面到了技术2面+hr面,最终挂了。也许是因为不是科班出身,或者竞争对手学校牌子较好,还有不能上课期间全职去实习的原因吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: