专栏首页开发与安全2014.03.16 网易游戏TTT计划实习生笔试题

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

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

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

I 卷 基础题

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 

12345678910111213

#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

注:这跟栈生长方向没什么关系(linux是从高到低);一个对象有多个成员,内部肯定是从低地址到高地址排列下去,对一个对象

取地址取到的是起始地址(低地址);

 C++ Code 

12345678910111213

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 

12345678910111213141516171819202122232425

#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 

12345678910111213

#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 

12345678910111213141516171819202122232425262728293031323334353637383940

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 

123456789101112

//字符串比较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 

12345678910111213141516171819202122232425262728293031323334353637383940

// 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 numbersbool 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面,最终挂了。也许是因为不是科班出身,或者竞争对手学校牌子较好,还有不能上课期间全职去实习的原因吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)

    首先声明一下,本文只对十种排序算法做简单总结,并参照一些资料给出自己的代码实现,并没有对某种算法理论讲解,更详细的 了解可以参考以下资料(本人参考): 1、《d...

    s1mba
  • 十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    s1mba
  • 《linux c 编程一站式学习》课后部分习题解答

    1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?...

    s1mba
  • 1077: 输入入门(2)

    描述:计算A+B 输入:输入第1行为一个整数n(1≤n≤10),代表测试的组数。下面有n组测试数据,每组1行,为2个整数,为A, B。 输出:输出A+B的值...

    bboysoul
  • LeetCode 261. 以图判树(全部连通+边数=V-1)

    给定从 0 到 n-1 标号的 n 个结点,和一个无向边列表(每条边以结点对来表示), 请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。

    Michael阿明
  • 【HDU 5839】Special Tetrahedron(计算几何)

    共面判断就是用叉乘计算出ijk三点所在面的法向量,然后判断il向量是否和法向量垂直,是则共面。

    饶文津
  • 10:判决素数个数

    10:判决素数个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB描述 输入两个整数X和Y,输出两者之间的素数个数(包括X和Y...

    attack
  • 编程填空:第i位替换 编程填空:第i位取反 编程填空:左边i位取反

    写出函数中缺失的部分,使得函数返回值为一个整数,该整数的第i位和m的第i位相同,其他位和n相同。

    Dar_Alpha
  • 最大连续子序列和(最大子数组和)四种最详细的解法

    解法1:穷举暴力法 枚举左端点跟右端点,然后遍历更新所有的子序列和,最终得到结果就是最大的

    用户7727433
  • 树上莫队算法

    attack

扫码关注云+社区

领取腾讯云代金券