2013搜狐校園招聘筆試題

1、不定項選擇題

1.C/C++語言:如下打印結果爲()。html

#include <iostream>
using namespace std;

void swap_int(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}
void swap_str(char *a, char *b)
{
    char *temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a = 10;
    int b = 5;
    char *str_a = "hello world";
    char *str_b = "world hello";
    swap_int(a, b);
    swap_str(str_a, str_b);
    printf("%d, %d, %s, %s", a, b, str_a, str_b);
    return 0;
}

A. 10, 5, hello world, world hellonode

B. 10, 5, world hello, hello worldios

C. 5, 10, hello world, world hello算法

D. 5, 10, world hello, hello world編程

答:A。都是按值傳遞,不改變原值數組

詳解swap函數見:http://blog.chinaunix.net/uid-20769502-id-3436523.html網絡

2. C/C++語言:請問打印的兩個字符分別是()。多線程

#include <iostream>
using namespace std;

typedef struct object object;
struct object
{
    char data[3];
};

object obj_array[3] = {{'a', 'b', 'c'},
                        {'d', 'e', 'f'},
                        {'g', 'h', 'i'},
                        };

int main()
{
    object *cur = obj_array;
    printf("%c, %c", *(char*)((char*)(cur)+2), *(char*)(cur+2));
    return 0;
}

A.c, g分佈式

B. b, dide

C. g, g

D. g, c

答:A

cur中存儲的是'a‘的地址,當cur是object指針時,cur+1後cur存儲是數組下一個元素的首地址,即'd'的地址。當cur是char指針時,cur+1是'a'的下一個字符的地址,即'b'的地址

3. C/C++語言:請問在64位平臺機器下,如下程序的輸出結果()

char *string_a = (char*)malloc(100*sizeof(char));
char string_b[100];
printf("%d, %d",sizeof(string_a), sizeof(string_b));

A. 8, 100

B. 100, 8

C. 100, 100

D. 8, 8

答:A

string_a是一個指針,無論它指向的空間有多大,它自己的空間 是固定的。在64位平臺機器下,一個指針的大小是8。

四、假設二叉排序樹的定義是:一、若它的左子樹不爲空,則左子樹全部節點均小於它的根節點的值;二、若右子樹不爲空,則右子樹全部節點的值均大於根節點的值;三、它的左右子樹也分別爲二叉排序樹。下列哪一種遍歷以後獲得一個遞增有序數列(B)
A、前序遍歷    B、中序遍歷     C、後序遍歷      D、廣度遍歷

分析:要是獲得的序列爲遞增,應先訪問左子樹,再訪問根結點,最後訪問右子樹,根據定義知爲中序遍歷

5. 往一個棧順序push下列元素:ABCDE,其pop可能的順序,下列不正確的是()

A. BACDE

B. ACDBE

C. AEBCD

D. AEDCB

答:C。

6. 1100|1010, 1001^1001, 1001&1100分別爲()

A. 1110, 0000, 1000

B. 1000, 1001, 1000

C. 1110, 1001, 0101

D. 1000, 1001, 1000

答:A

1 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0

1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 0 = 0

1 & 1 = 1, 1 & 0 = 0, 0 & 0 = 0

7.二叉樹是一種樹形結構,每一個節點至多有兩顆子樹,下列必定是二叉樹的是()

A. 紅黑樹

B. B樹

C. AVL樹

D. B+樹

答:AC

8.int A[2][3] = {1, 2, 3, 4, 5, 6}, A[1][0]和*(*(A+1)+1)的值分別是()。

A. 4, 5

B. 4, 3

C.3, 5

D.3, 4

答:A

數組是A[2][3] = {{1, 2, 3}, {4, 5, 6}},數組下標從0開始計數。前者是第1行第0列,後者是第1行第1列

9.序列16, 14, 10, 8, 7, 9, 3, 2, 4, 1的說法下面哪個正確()

A. 是大頂堆

B. 是小頂堆

C. 不是堆

D. 是二叉排序樹

答:A

 

10. 輸入若已是排好序的,下列排序算法最快的是()

A. 插入排序

B. Shell排序

C. 合併排序

D. 快速排序

答:A

插入排序一遍掃描便可

Shell排序雖不須要交換數據,但也要進行幾回插入排序

合併排序雖不須要交換數據,但也要進行lgn次合併

快速排序在數列有序的狀況下效率是最低的

11.一種既有利於短做業又兼顧長期做業的調度方法是()。

A. 先來先服務

B. 均衡調度

C. 最短做業優先

D. 最高響應比優先

答:D

分析:最高響應比優先法(HRN,Highest Response_ratio Next)是對FCFS方式和SJF方式的一種綜合平衡。FCFS方式只考慮每一個做業的等待時間而未考慮執行時間的長短,而SJF方式只考慮執行時間而未考慮等待時間的長短。所以,這兩種調度算法在某些極端狀況下會帶來某些不便。HRN調度策略同時考慮每一個做業的等待時間長短和估計須要的執行時間長短,從中選出響應比最高的做業投入執行。    響應比R定義以下: R =(W+T)/T = 1+W/T  
  其中T爲該做業估計須要的執行時間,W爲做業在後備狀態隊列中的等待時間。每當要進行做業調度時,系統計算每一個做業的響應比,選擇其中R最大者投入執行。這樣,即便是長做業,隨着它等待時間的增長,W / T也就隨着增長,也就有機會得到調度執行。這種算法是介於FCFS和SJF之間的一種折中算法。因爲長做業也有機會投入運行,在同一時間內處理的做業數顯然要少於SJF法,從而採用HRN方式時其吞吐量將小於採用SJF 法時的吞吐量。另外,因爲每次調度前要計算響應比,系統開銷也要相應增長。 
等待時間必定,要求服務的時間越短,先運行;要求服務的時間必定,等待時間越長,先運行。

12.同一進程下的線程能夠共享()

A. stack

B. data section

C. register set

D. thread ID

答:B

A是棧區。同一個進程的線程共享堆區,可是各自維護本身的棧區

B是數據區。

C是寄存器

D線程ID。同一進程的線程共享一進程ID,各自擁有本身的線程ID

參考http://blog.csdn.net/yang201240/article/details/7243991

13.系統中的「顛簸」是由()引發的。

A. 內存容量不足

B. 缺頁率高

C.交換信息量大

D. 缺頁率反饋模型不正確

答:D

「顛簸」是《計算機操做系統》中的「抖動」,A和B會形成抖動,但不是主要緣由。主要緣由是因爲每一個進程的頁面數沒有很好地計算,致使某些頁面反覆地進出。

14.8瓶酒一瓶有毒,用人測試。每次測試結果8小時後纔會獲得,而你只有8小時的時間,最少須要()人測試

A. 2

B. 3

D. 4

D. 6

答:B。相似不帶差錯控制的海明碼。淘寶出過這種題。相似這樣的題都可有2^x=8得出x=3。。

是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的二進制數,就是毒酒的編號。

1五、下列關於網絡編程錯誤的是(ABD)
A、TCP創建和關閉鏈接都只須要三次握手
B、UDP是可靠服務
C、主動關閉的一端會出現TIME_WAIT狀態
D、服務端編程會調用listen(),客戶端也能夠調用bind()

答:ABD

TCP的關閉鏈接是四次握手

UDP提供的是面向無鏈接的不可靠服務

C參考http://blog.csdn.net/zhangjay/article/details/6403076

客戶端不能夠調用bind()

16. 進程間的通信有哪幾種形式()

A. Socket

B. Pipe

C. Shared memory

D. Signal

答:ABCD

1七、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;

1八、分佈式系統設計包括(ABCDE)
A、容錯,design for fault
B、多數據中心的數據一致性
C、數據/服務可靠性
D、可擴展性
E、要知足ACID特性

 

19.10個不一樣的球,放入3個不一樣的桶內,共有()種方法

A. 1000

B. 720

C. 59049

D. 360

答:C

3^10

20.87的100次冪除以7的餘數是多少()

A. 1

B. 2

C. 3

D. 4

答:D

由公式(a*b)%c == (a%c)*(b%c)可知(87^100)%7=(87%7)^100=(3^100)%7

對於任意n(n>=0),(3^n)%7只能6種可能,依次爲1,3,2,6,4,5……

87^100%7=3^100%6=9^50%7=2^50%7=32^10%7=4^10%7=16^5%7=2^5%7=32%7=4

2、簡答題

1. (1)請描述進程和線程的區別?
4-16筆試第七題和 Linux2.6進程
(2)多線程程序有什麼優勢,缺點?
(3)多進程程序有什麼優勢,缺點?與多線程相比,有何區別。
 
2.寫代碼:反轉一個單鏈表,分別以迭代和遞歸形式實現
typedef struct node LinkNode;
struct node
{
    int data;
    LinkNode *Next;
};
//@ret 返回新鏈表頭節點
LinkNode *reverse_link(LinkNode *head);
LinkNode *reverse_link_recursive(LinkNode *head);
#include <iostream>
using namespace std;

typedef struct node LinkNode;
struct node
{
    int data;
    LinkNode *Next;
};
//@ret 返回新鏈表頭節點
LinkNode *reverse_link(LinkNode *head);
LinkNode *reverse_link_recursive(LinkNode *head);
//非遞歸方法
LinkNode *reverse_link(LinkNode *head)
{
    LinkNode *p = head;
    while(p->Next != NULL)
        p = p->Next;
    LinkNode *ret = p;
    LinkNode *q = head;
    while(1)
    {
        while(q->Next != p)
            q = q->Next;
        p->Next = q;
        p = q;
        if(q == head)
        {
            q->Next = NULL;
            break;
        }
        q = head;
    }
    return ret;
}
//遞歸方法
LinkNode *reverse_link_recursive(LinkNode *head)
{
    if(head->Next == NULL)
        return head;
    LinkNode *ret = reverse_link_recursive(head->Next);
    head->Next->Next = head;
    head->Next = NULL;
    return ret;
}
//輸出結果,用於測試
void Print(LinkNode *head)
{
    LinkNode *p = head;
    while(p)
    {
        cout<<p->data<<' ';
        p = p->Next;
    }
    cout<<endl;
}
//不是題目要求,用於測試
int main()
{
    int i;
    LinkNode *p = NULL;
    for(i = 0; i < 10; i++)
    {
        LinkNode *q = new LinkNode;
        q->data = i;
        q->Next = p;
        p = q;
    }
    Print(p);
    p = reverse_link(p);
    Print(p);
    p = reverse_link_recursive(p);
    Print(p);
    return 0;
}
// 返回新鏈表頭節點
LinkNode *reverse_link(LinkNode *head)
{
    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;
}

LinkNode *reverse_link_recursive(LinkNode *head)
{
    if(head == NULL)
        return NULL;
    LinkNode *curr , *reverse_head , *temp;
    if(head->next == NULL)    // 鏈表中只有一個節點,逆轉後的頭指針不變
        return head;
    else
    {
        curr = head;
        temp = head->next;    // temp爲(a2,...an)的頭指針
        reverse_head = reverse_link_recursive(temp);   // 逆轉鏈表(a2,...an),並返回逆轉後的頭指針
        temp->next = curr;    // 將a1連接在a2以後
        curr->next = NULL;
    }
    return reverse_head;      // (a2,...an)逆轉鏈表的頭指針即爲(a1,a2,...an)逆轉鏈表的頭指針
}

三、給一個數組,元素都是整數(有正數也有負數),尋找連續的元素相加之和爲最大的序列。
如:一、-二、三、五、-四、6 連續序列三、五、-四、6的和最大。
如元素全爲負數,則最大的和爲0,即一個也沒有選。
/*
array[]     輸入數組
n           數組元素個數
            返回最大序列和
*/
int find_max_sum(int array[] , int n)

int find_max_sum(int array[] , int n)
{
    int i , max , sum;
    sum = max = array[0];
    for(i = 1 ; 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;
}
#include <iostream>
using namespace std;
int main()
{
    int n,m,i,j,num,start,end,start1;
    long max,temp;
    while(cin>>n)
    {
        for(j=1;j<=n;j++)
        {
            cin>>m;
            cin>>num;
            max=temp=num;
            start=start1=end=1;
            for(i=2;i<=m;i++)
            {
                cin>>num;
                if(temp>=0) {temp=num+temp;}
                else
                {
                    temp=num;
                    start1=i;
                }
                if(temp>max)
                {
                    max=temp;
                    start=start1;
                    end=i;
                }
            }
            cout<<"Case "<<j<<':'<<endl;
            cout<<max<<' '<<start<<' '<<end<<endl;
            if(j!=n) cout<<endl;
        }
    }
    return 0;
}

3、設計題
一、設計一個圖片存儲系統:假設有一個相冊系統,每一個用戶不限制上傳的圖片數目,每張相片壓縮後都在1M之內,需求以下:
(1)文件數量太大,採用傳統的文件系統存儲致使目錄系統很是臃腫,訪問速度變得緩慢;
(2)單機存儲容量已經遠遠不能承載全部的文件;
(3)上傳以後,用戶只有讀取操做和刪除操做,不支持修改,整個系統讀寫比例10:1

思路:可使用分佈式的文件系統,以爲hadoop的HDFS很符合要求,這是hadoop對googleGDFS的實現。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息