1. 程式人生 > >三七互娛2018筆試題

三七互娛2018筆試題

三七互娛,一個小時,十個簡答題,也許是想用時間先刷掉一批人吧。

一、指標和引用的區別?

(1)指標可以不初始化,引用必須初始化。

(2)指標可以改變其指向,引用一經引用,無法改變。

(3)指標有二級指標,引用沒有二級引用(C++11標準除外)。

(4)sizeof一個指標,32位機器下為4位元組,sizeof一個引用,求的是引用物件的位元組數。

指標和引用在彙編上都是一樣的,都是在棧上開闢一塊記憶體,用於存放指向物件的地址。只不過是引用直接將引用物件的地址放入暫存器中,而指標則是先將自己的地址放進去,取得指向物件的地址。

二、單鏈表的逆置?

 typedef struct Node
{
int data;
struct Node *next;
}Node,*List;

void ListRevers(List head)
{
assert(head!= NULL);                                                                    
if(head==NULL || head->next==NULL)
{
return ;
}
Node *p = head->next;                                                               
Node *q;
head->next = NULL;                                                                       
while(p != NULL)                                                                           
{
q = p->next;                                                                             
p->next = head->next;                                                              
head->next = p;
p = q;
}
}
三、記憶體分配的方式有幾種?

靜態儲存區 棧 堆 的記憶體分配
1,從靜態儲存區域分配記憶體。程式編譯的時候記憶體已經分配好了,並且在程式的整個執行期間都存在,例如全域性變數。
2,在棧上建立。在執行函式時,函式內區域性變數的儲存單元可以在棧上建立,函式結束時這些儲存單元自動被釋放。
處理器的指定集中有關於棧記憶體的分配運算,因此效率比較高,但是分配的記憶體容量有限。
3,在堆上分配記憶體,亦稱動態記憶體分配,程式在執行的時候用malloc函式或new運算子申請任意大小的記憶體,程式設計師
要用free函式或delete運算子釋放記憶體。動態記憶體使用非常靈活,但問題也很多。 

四、STL中的容器有哪些,他們的特徵?

順序容器:vector,list,deque

關聯容器:set,multiset,map,multimap

容器介面卡:queue,stack

vector的底層是一個動態開闢的可變長的陣列,他的記憶體是連續的。定義一個vector,在32位機器,VS下,棧上的大小為20位元組,五個指標。bool型別的話為24位元組。它所指向的堆上vector陣列的初始大小為0,每次呈二倍增長方式,VS其實不為2。他適合查詢和以及尾插,尾刪資料。

list的底層是一個帶頭結點的雙鏈表,他預設開闢一個頭結點。可以使用splice方法,將一個連結串列上資料切下來鏈到另一個連結串列上。

deque底層是一個動態開闢的二維陣列,預設開闢的大小為,int size = 4096 > sizeof(Ty) ? 4096/sizoef(Ty) : 1。

五、20個人輪流報數,數到3的人出局,求出局的序列?

void fun()

{

vector<int> ve(20,0);

int num = 0;

while(num < 20)

{

for(int i = 0; i < 20; ++i)

{

if(ve[i] == 0)

num++;

if(num == 3)

{

ve[i] = 1;

num = 0;

cout<<i<<" ";

}

}

}

cout<<endl;

}

六、寫出String類的構造,拷貝構造,賦值,解構函式?

class String

{

public:

String(const char *str)

{

if(str == NULL)

{

m_data = new char[1];

m_data = '\0';

}

else

{

m_data = new char[strlen(str) + 1];

strcpy(m_data,str.m_data);

}

}

String(const String &it)

{

m_data = new char[strlen(it.m_data) + 1];

strcpy(m_data,it.m_data);

}

~String()

{

delete []m_data;

m_data = NULL;

}

String &operator=(const String  &it)

{

if(this == &it)

{

return *this;

}

delete []m_data;

m_data = new char[strlen(it.m_data) + 1];

strcpy(m_data,it.m_data);

return *this;

}

private:

char *m_data;

};

其次還有一道資料庫的題印象頗深,剩餘的題就沒有什麼了。