劍指offer 二 2 資料結構之陣列2 面試題3

2021-07-14 06:58:48 字數 2451 閱讀 5255

c++要求定義陣列時,必須明確給定陣列大小,但很多情況下,預編譯時並不能確定陣列長度。為解決陣列空間效率不高問題,設計實現了多種動態陣列。

c++中,動態記憶體分配技術可以在程式執行中按實際需要申請適量記憶體,使用結束後還可以釋放【申請和釋放的記憶體單元是堆物件,new和delete】

建立一維陣列:new 型別名 [陣列長度];陣列長度指出陣列元素個數,可以是任何能得到正整數值的表示式。

delete 指標名;

最好是將陣列的建立和刪除過程封裝起來,形成乙個動態陣列類,便於使用。動態陣列類中,通過類的成員函式訪問陣列元素,每次訪問前檢查下標是否越界。

【標頭檔案的assert可以實現這種檢查,注意,它僅在debug模式下生效。其功能:判斷一條件表示式的值是否為true,若不為真,則程式終止,並報錯】

動態申請的陣列是沒有名字的,需要用指標使用。

建立多維陣列:new 型別名 t[陣列第1維長度][陣列第2維長度]……;

第1維長度可以是任何結果為正整數的表示式,其他各維陣列長度必須是結果為正整數的常量表示式。

申請成功後,new返回乙個指向新分配記憶體的首位址的指標,指向t型別陣列的指標。

陣列元素個數:除最左邊一維外各維下標表示式的乘積。

new動態陣列不能在使用過程中動態擴充套件空間,而vector作為向量容器,可以動態的擴充套件容器空間。

vector定義動態陣列:vector《元素型別》陣列物件名(陣列長度表示式);

vector定義的陣列物件的所有元素都會被初始化

若陣列元素為基本資料型別,所有元素初始化為0;

若陣列元素為類型別,呼叫類的預設建構函式初始化;【該種動態陣列要保證作為陣列元素的類具有預設建構函式】

初值可以指定,但只能為所有元素指定相同初值,形式:

vector《元素型別》陣列物件名(陣列長度,元素初值);

vector陣列物件元素訪問方式:陣列物件名[下標表示式],陣列物件名表示的是乙個陣列物件,而非陣列首位址。

陣列物件不是陣列,而是封裝了陣列的物件。

int n=5;  vectorarr(n);  arr.size();----返回陣列容器大小,實際有效的元素個數。

動態擴容實現:陣列的空間不足時,vector物件自動用new分配一塊更大區域,使用賦值運算子=將原有資料賦值到新的空間,並釋放原有空間。為提高效率,vector陣列每次擴充容量時,新容量都是前一次的兩倍。

arr.capacity();---返回陣列的容量,所能容納的元素數目。

arr.reserve(n);---n是整型資料,若當前容量≥n,什麼也不做;否則擴大arr容量,使arr容量不小於n.

使用動態陣列要儘量減少改變陣列容量大小的次數。【每次擴容需要大量額外操作】在向vector中插入大量資料前,粗略估計插入元素之後的向量元素的大小,在插入前使用reserve確保該部分空間被分配,避免多次重新分配空間。

插入新元素時,插入位置之後的元素都被順序向後移動,插入操作效率並不高。要注意在不同位置上插入可能導致某些迭代器、指標和引用的失效。

刪除向量中元素時,被刪除元素後面的元素都會被向前移動,將被刪去元素留下的空位補上。刪除元素之後的迭代器、指標和引用會失效。刪除元素時,並不會釋放空閒空間,可用vector(s.begin(),s.end()).swap(s);  【用s的內容建立臨時的vector物件,將該容器與s交換,s原先占有的空間便屬於臨時物件,執行完該句後,臨時物件被析構、釋放】釋放空閒空間。

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和整數,判斷陣列中是否含有該整數。

思路與分析:二維陣列在記憶體中連續存放。記憶體中從上到下儲存各行元素,同一行中則由左到右儲存各元素。通過觀察具有該特性的具體的二維陣列,找到查詢規律。可以選擇從左下角或者右上角(以此為例)的數字開始進行查詢,若等於要查詢的數字,查詢結束;若該數字大於要查詢的數字,則剔除這個數字所在的列;若該數字小於要查詢的數字,則剔除該數字所在行。不斷縮小範圍直至找到要查詢的數字,或查詢範圍為空。

#include using namespace std;

bool findkey(int a[4], int rows, int columns, int value)

else if (a[row][column] > value)

else

}return false;

}int main()

; bool flag = findkey(a, 4, 4, 7);

if (flag)

else

cout << "not find" << endl;

system("pause");

return 0;

}

其實**可以寫的更完善些的。。。

資料結構(劍指offer)(堆疊)(python)

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 時間複雜度應為o 1 思路 用空間換時間,用乙個輔助棧記錄當前棧中的最小值。輔助棧元素個數和資料棧保持一樣的數目。例如一次壓入資料棧數字串行為 3,2,4,1,5 那麼一次壓入輔助棧的為 3,2,2,1,1 當每次壓入資料棧...

劍指offer 五) 資料結構 棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧中所含最小元素的min函式 時間複雜度應為o 1 程式 思路 利用乙個輔助棧來存放最小值 棧 3,4,2,5,1 輔助棧 3,3,2,2,1 每入棧一次,就與輔助棧頂比較大小,如果小就入棧,如果大就入棧當前的輔助棧頂 當出棧時,輔助棧也要出棧 這種做法...

劍指offer 資料結構類題目()

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。入隊時資料存到stackin,出隊時資料從stackout彈出。執行入隊操作時,資料源源不斷的壓入棧stackin。執行出隊操作時,stackout為空,則把stackin裡的資料全部彈出壓倒stackout中,當st...