SOHU2013技術中心新生訓練營技術筆試題
一、不定項選擇題
1、HTTP狀态碼500代表什麼含義(C)
A、請求資源未在伺服器上發現
B、請求成功,相應的響應頭或資料包丢失
C、伺服器錯誤
D、傳回時間500ms
分析:HTTP狀态碼:
1xx消息:代表請求已被接受,需要繼續處理。這類響應是臨時響應,隻包含狀态行和某些可選的響應頭資訊,并以空行結束。
2xx成功:代表請求已成功被伺服器接收、了解、并接受。
3xx重定向:代表需要用戶端采取進一步的操作才能完成請求。通常,這些狀态碼用來重定向,後續的請求位址(重定向目标)在本次響應的Location域中指明。
4xx請求錯誤:碼代表用戶端看起來可能發生了錯誤,妨礙了伺服器的處理。
5xx伺服器錯誤
2、下面那些不是連結清單的特點(B)
A、插入不需要移動
B、快速随即通路一個節點
C、所需存儲空間與線性表長度成正比
D、不用預估計存儲大小
3、五個元素按照ABCDE的次序入棧,,其出棧可能的順序不正确的是(D)
A、EDCBA
B、DECBA
C、ABCDE
D、DCEAB
4、下面哪些不屬于面向對象的特征的是(D)
A、繼承
B、抽象
C、封裝
D、反射
5、mysql資料表有三個字段A、B、C,建立聯合索引ABC,查詢一下字段不需要聯合索引的是(D)
A、AB
B、AC
C、BC
D、C
6、TCP/UDP下面正确的是(B)
A、both TCP and UDP provide reliability service
B、TCP provide connection-oriented services
C、TCP cannot provide flow control
D、Both TCP and UDP provide retransmission services
注解:UDP是沒有保障的。
7、給出下面java代碼,
Class Test{
private int a;
public static void fun(){…}
};
如何使成員變量a被函數fun()直接通路?(B)
A、将private int a改成protected int a
B、 将private int a改成static int a
C、 将private int a改成public int a
D、将private int a改成int a
8、産生死鎖的四個必要條件是:互斥、(A)、循環等待和不可強占。
A、請求與保持
B、保持阻塞
C、請求與阻塞
D、獨立執行
9、下列屬于穩定的排序算法的是(A)
A、插入排序
B、快速排序
C、堆排序
D、選擇排序
10、下面哪些項是一個典型的優勢來實作分布式對象系統(ABCDE)
A、增加可擴充性
B、利用多個CPU
C、允許可伸縮性
D、資料/服務可靠性
E、實作了ACID特性
11、
#include <stdio.h>
int main(){
int s;
scanf(“%d”,&s);
while(s >0)
{
Switch(s)
{
case 1:printf(“%d”,s+5);
case 2:printf(“%d”,s+4);break;
case 3:printf(“%d”,s+3);
default: printf(“%d”,s+2);break;
}
scanf(“%d”,&s);
}
}
這段代碼輸入1 2 3 4 5 0回車,輸出結果是(A)
A、6566567
B、65665672
C、66667
D、666672
12、unsigned short hash(unsigned short key){return (key>>4)%256;}
請問hash(16),hash(256)的值分别是(A)
A、1,16
B、8,32
C、4,16
D、1,32
13、設fop已定義,執行語句fop=fopen(“file”,”w”);後,以下針對文本file進行操作正确的是(D)
A、寫操作結束後可以從頭開始讀
B、可以在原有内容後追加寫
C、可以随意讀和寫
D、隻能寫不能讀
14、linux的cron背景常駐程式(daemon)用于(D)
A、負責檔案在網絡找的共享
B、管理列印子系統
C、跟蹤管理系統資訊和錯誤
D、管理系統日常任務的排程
分析:crontab 指令常見于Unix和類Unix的作業系統之中,用于設定周期性被執行的指令。
15、以下資料結構中不屬于線性資料結構的是(C)
A、隊列
B、線性表
C、二叉樹
D、棧
分析:線性結構中的資料元素之間是一種線性關系,資料元素一個接一個地排列。常用的線性結構有:線性表,棧,隊列,循環隊列,數組。線性表中包括順序表、連結清單等。
16、SQL語言是什麼語言(C)
A、層次資料庫
B、網絡資料庫
C、關系資料庫
D、非資料庫
17、設一棵二叉樹中有3個葉子節點,有8個度為1的節點,則樹中總得節點數為(B)
A、12
B、13
C、14
D、15
分析:度為2的節點=葉子節點數-1.
18、下面有關測試原則的說法的說法不正确的是(BCD)
A、測試用例應由測試的輸入資料和語句的輸出結果兩部分組成
B、測試用例可自選合理的輸入資料
C、程式最好由編寫該程式的程式員自己來測試
D、使用測試用例進行測試是為了檢查程式員是否做錯了他該做的事情
19、屬于網絡層協定的是(B)
A、TCP
B、IP
C、UDP
D、FTP
分析:各層協定
網絡層:IP
傳輸層:TCP、UDP
應用層:TELNET、FTP、SMTP、WWW等
20、下列編碼中漢字一般占用3個位元組的是(B)
A、GBK
B、UTF-8
C、ASCII
D、Unicode
分析:GB2312、GBK到GB18030都屬于雙位元組字元集;Unicode:2位元組
二、填空題
1、在linux下,填寫完成如下操作的指令。
檢視java程序數(ps | grep java)
檢視磁盤空間(df)
2、棧操作的原則(先入後出)
隊列操作的原因是(先入先出)
3、線程的幾種基本狀态(就緒、阻塞和運作)
4、對一批編号為1-100的全部或開關朝上(開)的燈進行一下操作,凡是1的倍數的朝反方向撥一次,全部是2的倍數的又撥一次,3的倍數的反方向又撥一次。。。最後開挂不能熄滅的是(平方數)。
注解:撥開關的次數必須滿足一個條件:約數的個數是奇數個。
5、若某二叉樹的前序周遊通路順序是abdgcefi,中序順序是dgbaecif。那麼後續周遊通路順序是(gdbeifca)
三、簡答題
1、介紹一下設計模式的工廠模式和單例模式,并實作一個單例模式。
這個google搜尋一大堆。
2、快速排序法事應用最廣泛的排序算法之一,最佳情況下時間複雜度是O(nlogn)。但是最壞情況下可能達到O(n^2)。說明快速排序達到最壞情況的原因。并提出改善方案并實作之。
答:出現壞情況的原因是每次標明樞軸進行劃分之後所得的兩部分不均衡,導緻直到有序所需的劃分次數很大。
改善方案:
改變樞軸的選取方法。
每次随機選擇一個樞軸進行劃分。
代碼(C++):
[cpp] view plain copy print ?
- #include <iostream>
- #include <ctime>//time
- #include <cstdlib>//rand
- #include <algorithm>//swap
- using namespace std;
- //劃分-普通版本
- template <class KeyType>
- int partition(KeyType *a,int low,int high)
- {
- //int pivotKey = *(a + high);
- //int i = low;
- //int j = high - 1;
- //while(i < j)
- //{
- // while(i < j && pivotKey > *(a + i))
- // ++i;
- // while(i < j && pivotKey < *(a + j))
- // --j;
- // if(i < j)
- // swap(*(a + i),*(a + j));
- //}
- 将樞軸放到正确的位置
- //if(*(a + i) > *(a + high))
- // swap(*(a + i),*(a + high));
- //版本2
- int pivotKey = *(a + low);
- while(low < high)
- {
- while(low < high && *(a + high) > pivotKey)
- --high;
- *(a + low) = *(a + high);
- while(low < high && *(a + low) < pivotKey)
- ++low;
- *(a + high) = *(a + low);
- }
- *(a + low) = pivotKey;
- //return i;
- return low;
- }
- //劃分-随機化版本
- template <class KeyType>
- int partitionRandomized(KeyType *a,int low,int high)
- {
- //随機選取一個數作為樞軸
- //随機生成[low,high]中的一個數,作為樞軸的索引
- srand(time(NULL));
- int pivotKeyIndex = rand() % (high - low + 1) + low;
- //交換數組中最後一個元素與樞軸
- swap(*(a + high),*(a + pivotKeyIndex));
- return partition(a,low,high);
- }
- //快排-普通版本
- template <class KeyType>
- void QuickSort(KeyType *a,int low,int high)
- {
- if (low < high)
- {
- int mid = partition(a,low,high);
- QuickSort(a,low,mid - 1);
- QuickSort(a,mid + 1,high);
- }
- }
- //快排-随機化版本
- template <class KeyType>
- void QuickSortRandomize(KeyType *a,int low,int high)
- {
- if (low < high)
- {
- int mid = partitionRandomized(a,low,high);
- QuickSort(a,low,mid - 1);
- QuickSort(a,mid + 1,high);
- }
- }
- int main()
- {
- const int num = 7;
- int a[num] = {4,2,7,9,3,0,6};
- QuickSortRandomize(a,0,num - 1);
- for(int i = 0;i < num;++i)
- cout << *(a + i) << " ";
- cout << endl;
- }
3、說說session和cokies的差別。
分析:
什麼是cookie?
cookie分為二種
1,以檔案方式存在硬碟空間上的長期性的cookie
2,停留在浏覽器所占記憶體中的臨時性的cookie
浏覽網站時,你會經常發現網站登入的地方,會有提示,問你是不是要記住自己的登入狀态,像這種情況,登入時填寫的一些資訊會被以檔案的方式存放在用戶端的硬碟上。
當使用者登入後,session會在cookie端産生一個session_id,這個session_id是存于浏覽器所占用的記憶體當中。當你關閉浏覽器後,session_id也要消失了。
cookie采用的是在用戶端保持狀态的方案,它是用戶端的會話狀态的一種儲存機制。它是伺服器在本地機器上存儲的小段文本或者是記憶體中的一段資料,并随每一個請求發送至同一個伺服器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie規範。網絡伺服器用HTTP頭資訊向用戶端發送cookies,在客戶終端,浏覽器解析這些cookies并将它們儲存為一個本地檔案,或者本地記憶體中資料,它會自動将同一伺服器的任何請求縛上這些cookies,由于采用伺服器端保持狀态的方案在用戶端也需要儲存一個辨別,是以session機制借助于cookie機制來達到儲存辨別的目的,這樣就可以解決HTTP協定無狀态的缺陷。
什麼是session?
session是一種伺服器端的資訊管理機制,它把這些檔案資訊以檔案的形勢存放在伺服器的硬碟空間上,這種情況是預設的,可以用memcache把這種資料放到記憶體裡面。請參考web叢集時利用memcache來同步session
當用戶端向伺服器送出請求時,要求伺服器端産生一個session時,伺服器端會先檢查一下,用戶端的cookie裡面有沒有session_id,是否已經過期。如果有這樣的session_id的話,伺服器端會根據cookie裡的session_id把伺服器的session檢索出來。如果沒有這樣的session_id的話,伺服器端會重建立立一個。PHPSESSID是一串加了密的字元串,它的生成按照一定的規則來執行。同一用戶端啟動二次session_start的話,session_id是不一樣的。
session産生的session_id放在cookie裡面,如果使用者把cookie禁止掉,是不是session也不能用了呢?禁止掉cookie後,session當然可以用,不過通過其他的方式來獲得這個sessionid,比如,可以根在url的後面,或者以表單的形勢送出到伺服器端。進而使伺服器端了解用戶端的狀态。
session和cookie誰更安全?
就個人而言,我覺得session更安全一點,我以下幾點看法。
1,如果session和cookie一樣安全的話,二者就沒有并要同時存在了,隻要cookie就好了,讓用戶端來分提伺服器的負擔,并且對于使用者來說又是透明的。何樂而不為呢。
2,session的sessionID是放在cookie裡,要想功破session的話,第一要功破cookie。功破cookie後,你要得到 sessionID,sessionID是要有人登入,或者啟動session_start才會有,你不知道什麼時候會有人登入。第二,sessionID是加密的,第二次session_start的時候,前一次的sessionID就沒有用了,session過期時sessionid也會失效,想在短時間内功破加了密的 sessionID很難。session是針對某一次通信而言,會話結束session也就随着消失了,而真正的cookie存在于用戶端硬碟上的一個文本檔案,誰安全很顯然了。
3,如果session這麼容易被功破,這麼不安全的話,我想現有的絕大部分網站都不安全了。
SOHU 2013校園招聘筆試試卷
一、不定項選擇題
1.C/C++語言:以下列印結果為()。
[cpp] view plain copy
- #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 hello
B. 10, 5, world hello, hello world
C. 5, 10, hello world, world hello
D. 5, 10, world hello, hello world
答:A。都是按值傳遞,不改變原值
2. C/C++語言:請問列印的兩個字元分别是()。
[cpp] view plain copy
- #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, d
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位平台機器下,以下程式的輸出結果()
[cpp] view plain copy
- 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
要是得到的序列為遞增,應先通路左子樹,再通路根結點,最後通路右子樹,根據定義知為中序周遊
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
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。類似不帶差錯控制的海明碼。淘寶出過這種題。
答:ABD
TCP的關閉連接配接是四次握手
UDP提供的是面向無連接配接的不可靠服務
C參考http://blog.csdn.net/zhangjay/article/details/6403076
用戶端不可以調用bind()
16. 程序間的通訊有哪幾種形式()
A. Socket
B. Pipe
C. Shared memory
D. Signal
答:ABCD
參考4-16筆試
答:AC
答:ABCDE
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……
二、簡答題
1. (1)請描述程序和線程的差別? 見 4-16筆試第七題和 Linux2.6程序 (2)多線程程式有什麼優點,缺點? (3)多程序程式有什麼優點,缺點?與多線程相比,有何差別。 2.寫代碼:反轉一個單連結清單,分别以疊代和遞歸形式實作 [cpp] view plain copy
- typedef struct node LinkNode;
- struct node
- {
- int data;
- LinkNode *Next;
- };
- //@ret 傳回新連結清單頭節點
- LinkNode *reverse_link(LinkNode *head);
- LinkNode *reverse_link_recursive(LinkNode *head);
答:
[cpp] view plain copy
- #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;
- }
答:最大和子序列,HDOJ1003
http://acm.hdu.edu.cn/showproblem.php?pid=1003
[cpp] view plain copy
- #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;
- }
三、設計題
其他:
1.對于一個整數矩陣,存在一種運算,對矩陣中任意元素加一時,需要其相鄰(上下左右)某一個元素也加一,現給出一正數矩陣,判斷其是否能夠由一個全零矩陣經過上述運算得到。析:有2個弱判斷準則,不過不知道3個加起來是不是和題目等價
2.一個整數數組,長度為n,将其分為m份,使各份的和相等,求m的最大值
比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
{3,6}{2,4,3} m=2
{3,3}{2,4}{6} m=3 是以m的最大值為3包問題, 當然有些條件可以預先判斷,比如(所有元素的和%m)!=0, 那麼就不需要處理了.
3.求一個數組的最長遞減子序列 比如{9,4,3,2,5,4,3,2}的最長遞減子序列為{9,5,4,3,2}直接周遊, O(n
4.一個數組是由一個遞減數列左移若幹位形成的,比如{4,3,2,1,6,5}是由{6,5,4,3,2,1}左移兩位形成的,在這種數組中查找某一個數。
分析:二分法查找分界點, 再二分法查找O(ln(n))
原文位址:
http://blog.csdn.net/doc_sgl/article/details/8907655