2014.03.16 網易遊戲TTT計劃實習生筆試題

s1mba發表於2014-03-26

注:這份試題是本人事後回憶的,題目可能會有出入,且給出的答案不一定正確,僅供參考,歡迎指正錯誤。


前面這些題是試卷的第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

注:這跟棧生長方向沒什麼關係(linux是從高到低);一個物件有多個成員,內部肯定是從低地址到高地址排列下去,對一個物件

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

 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面,最終掛了。也許是因為不是科班出身,或者競爭對手學校牌子較好,還有不能上課期間全職去實習的原因吧。


相關文章