- 【筆試部分】
- 【單選】
1.對於堆和棧的描述,正確的是()
A.棧的大小會隨着函數調用層次的變化而變化
B.從堆上申請內存,沒有釋放的話,會造成內存泄漏;棧的內存由編譯器管理,不會內存泄漏
C.在windows上,堆的生長方向是向下的,隨着內存地址減小的方向增長;棧的生長方向是向上的,即向着內存地址增加的方向增長
D.在C語言中,指針只能指向堆上的內存,不能指向棧上的內存
【考查知識點】堆與棧
【解析】棧一般都一個默認大小,棧的地址空間是連續的,如果任其增長會給內存帶來困難,A錯誤;棧由編譯器在需要的時候分配,不需要的時候自動清除,而堆是由程序員來釋放的,容易產生內存泄漏,而棧是由系統管理的,B正確。對於堆來說,生長方向是向上的,也就是向着內存地址增加的地方;對於棧來說,生長方向是向下的,是向着內存地址減小的方向增長,如下圖所示,C錯誤;C語言中指針也可以指向棧,如char buf[10]={0};char *buff=buf;buff[1]=’a’;D錯誤。
低 ->|-----------------| |
2.對於線程和進程的描述,正確的是
A.進程退出前,需要手動銷燬所有線程,否則進程退出後,依然會有線程在運行,可能導致不可預測的後果
B.在單核的CPU上使用多線程,並不會比單線程有優勢
C.進程是調度和擁有資源的基本單位
D.使用全局變量、內存時,需要使用同步機制,因爲它們在同一地址空間內
【考查知識點】線程與進程
【解析】通常一個任務不光CPU要花時間,I/O也要花時間,一個進程等I/O時,CPU是閒置的,另一個進程可以利用CPU進行計算,單核多線程指的是單核CPU輪流執行多個線程,通過給每個線程分配CPU時間片來實現,因爲時間片非常短用戶感覺是多個線程同時執行,B錯誤;進程是擁有資源的基本單位,線程是獨立調度的基本單位,C錯誤;D正確。
3.某二叉樹有2000個節點,則二叉樹的最小高度爲:
A.9 B.10 C.11 D.12
【考查知識點】二叉樹
【解析】最低爲log2(n+1) ,最高爲n,故答案選C
4.在C++中,定義“int *p=new int(10)”,釋放p指向的內存,語句是()
A.delete *p B.delete &p C.delete p D.delete []p
【考查知識點】指針
【解析】int *p=new int-分配一個int型變量所佔大小的空間,並將首地址賦給int*型指針p;int *p=new int[10]-分配一個有10個int型元素的數組所佔空間,並將該數組的第一個元素的地址賦給int*型指針p;int *p=new int(10)-分配一個int型變量所佔大小的空間,並賦值10。一般用法是new一個數組的話用delete [],其他直接用delete即可。
5.某函數有且只有2個輸入參數,參數A的取值可劃分爲5個等價類,參數B的取值可劃分爲3個等價類。至少應爲函數設計()組測試數據
A.4 B.10 C.15 D.30
【補充】等價類劃分是一種典型的黑盒測試方法。在測試時分爲一般等價類測試、健壯等價類測試。
一般等價類測試中包括弱一般等價類(“弱”指含單缺陷設計)和強一般等價類(“強”指含多缺陷設計),“一般”指不考慮無效值。弱一般等價類測試用例通過使用一個測試用例中的每個有效等價類(區間)的代表值來實現(常以對稱方式來標識這些測試用例,且注意單邊假設作用);強一般等價類測試用例通過每個獨立變量的有效等價類的笛卡爾積來實現。
弱健壯等價類測試。弱健壯等價類測試中的無效測試用例只含一個無效值,其他都是有效值,即含有單缺陷假設。【注:“弱”是指含單缺陷假設,“強”是指含多缺陷假設;“健壯”是指考慮無效值】; 強健壯等價類測試考慮了更多的無效值情況。強健壯等價類測試中的無效測試用例可以包含多個無效值,即含有多個缺陷假設。NextDate函數有三個變量,故相應地強健壯等價類測試用例可包含一個無效值、兩個無效值或三個無效值。【注:“強”是指含多缺陷假設,“強”是指含多缺陷假設;“健壯”是指考慮無效值】
【解析】(求大神解答)
6.下列哪些linux的跨進程通信方式不適合數據傳輸()
A.pipe,管道 B.shared memory,共享內存 C.socket,套接字 D.semaphore,信號量
【考察知識點】進程通信
【解析】linux進程通信的6種方式有管道、信號量、信號、消息隊列、共享內存和套接字。管道允許一個進程和另一個與它有共同祖先的進程之間通信;信號量作爲進程間及同進程不同線程間的同步手段;信號可用於進程間通信和進程本身通信;消息隊列是消息的鏈表,允許一個或多個進程向它寫入與讀取消息;共享內存使多個進程訪問同一塊內存空間;套接字用於不同機器之間的進程間通信。選A
7.如果計算機內存大小爲1G,虛擬地址空間爲4G,在計算機系統上,需要的指針長度爲()位
A.32 B.30 C.64 D.16
【考查知識點】虛擬內存
【解析】最大尋址空間爲4G,則指針爲32位,232=4GB
8.在32位系統上,下面程序的輸出結果是()
#include<stdio.h>
void Foo(char param[20]) {
printf("%d\n", sizeof(param));
printf("%d\n", strlen(param));
}
int main(int argc, const char * argv[]) {
char str1[] = "Hello\0dji";
char str2[] = { 'H','e','l','l','o','\0','d','j','i' };
printf("%d\n", sizeof(str1));
printf("%d\n", sizeof(str2));
Foo(str1);
}
A.10 9 4 5 B.10 9 20 5 C.9 9 20 5 D.9 9 9 5
【考查知識點】sizeof
【解析】因爲str1‘\’和‘0’是分開計算而str2是合起來計算的,所以sizeof(str1)爲10,sizeof(str2)爲9;Foo函數中,數組作爲參數傳遞時會退化成指針,在32位操作系統中,指針佔4個字節(64位操作系統佔8個字節);strlen是計算char的長度,以’\0’爲字符串結束的標誌,所以傳入Hello,爲5.
9.使用以下哪種技術無法僞裝自己的IP地址()
A.HTTP Proxy B.Socks Prox C.VPN D.修改DNS
【解析】HTTP Proxy是HTTP代理,其中的一個作用就是訪問,通過刪除HTTP報文中的身份特性從而對遠端服務器隱藏原始用戶的IP地址及其他細節,同時HTTP代理也不會記錄用戶訪問記錄的log,A正確;Socks Prox是Socket代理,可以將瀏覽器的上網行爲保護起來,如果需要所有互聯網訪問保護起來就需要使用VPN,因此BC正確;修改DNS可以提高上網的速度,可以訪問某些因爲域名解析存在問題而不能訪問的網站,可以屏蔽運營商的廣告避免被釣魚的危險,但並不能僞裝IP地址,D錯誤。
- 【雙選】
1.有一項考試的成績,目前是按照完成時間進行升序排列的,需要按照考試成績進行排序,成績高的排在前面,如果成績相同,則完成時間短的排在前面。以上場景適合採用下列哪些排序算法?
A.插入排序 B.快速排序 C.堆排序 D.冒泡排序
【解析】本題實際考察哪種排序算法是穩定的,插入、冒泡是穩定的,快速和堆是不穩定的。
2.下列關於HTTP協議,描述正確的是
A.HTTP協議工作在應用層
B.HTTP只能使用80端口,HTTPS只能使用443端口
C.HTTP是有狀態協議
D.HTTP協議支持一定時間內的TCP連接保持,這個連接可以用於發送/接收多次請求
【解析】HTTP是應用層協議,A正確;HTTP常用端口80/8080/3128/8081/9098,HTTPS默認端口TCP/443,UDP/443,B錯誤;HTTP是無狀態協議,協議的狀態是指下一次連接而維護這次連接所傳輸的信息,比如客戶獲得一張網頁之後關閉瀏覽器,然後再一次啓動瀏覽器,再登陸該網站,但是服務器並不知道客戶關閉了一次瀏覽器。由於Web服務器要面對很多瀏覽器的併發訪問,爲了提高Web服務器對併發訪問的處理能力,在設計HTTP協議時規定Web服務器發送HTTP應答報文和文檔時,不保存發出請求的Web瀏覽器進程的任何狀態信息。這有可能出現一個瀏覽器在短短几秒之內兩次訪問同一對象時,服務器進程不會因爲已經給它發過應答報文而不接受第二期服務請求。 由於Web服務器不保存發送請求的Web瀏覽器進程的任何信息,因此HTTP協議屬於無狀態協議,可以通過Cookie和Session將狀態分別保存在客戶端和服務器端,C錯誤;HTTP是建立在TCP協議之上的,建立和釋放連接的時間都很短,所以HTTP是一種短連接,爲了解決每次連接釋放效率低的問題,提出keep-alive保持連接特性,可以在一段時間內多次發送、接收,D正確。
- 【編程題】
給出一串阿拉伯數字,輸出對應的中文讀法。
輸入描述:
輸入m,範圍是0<=m<100000000
樣例:
18
輸出:十八
答:(僅供參考)
#include<iostream>
using namespace std;
void fun(long n)
{
if (n == 0)
{
cout << 0;
return;
}
int temp = 0;
long arr[5] = { 0 };
int i = 0;
int j = 4;
while (n)
{
temp = n % 10;
arr[j] = temp;
n /= 10;
--j;
++i;
}
int k = 0;
while (i)
{
k = 5 - i;
switch (i)
{
case 1:if (arr[k] != 0)
{
cout << arr[k];
}
break;
case 2:if (arr[k] != 0)
{
cout << arr[k] << "S";
}
else if (arr[k] == 0 && arr[k+1] != 0 )
{
cout << "L";
}
break;
case 3:if (arr[k] != 0)
{
cout << arr[k] << "B";
}
else if (arr[k] == 0 && arr[k + 1] != 0 && (arr[3] ||arr[4]))
{
cout << "L";
}
break;
case 4:if (arr[k] != 0)
{
cout << arr[k] << "Q";
}
else if (arr[k] == 0 && arr[k + 1] != 0 && (arr[2] ||arr[3]))
{
cout << "L";
}
break;
case 5:if (arr[k] != 0)
{
cout << arr[k] << "W";
}
break;
default:
break;
}
--i;
}
}
int main()
{
/*
12001 1W2QL1
*/
long n = 0;
while (1)
{
cin >> n;
if (n >= 0 && n <= 99999)
{
fun(n);
cout << endl;
}
}
return 0;
}
【注】更多面經、筆試、資料將在vx恭重號【IT開發與進階】持續更新,歡迎關注粉我~