劍指offer讀書筆記

2021-07-29 07:20:07 字數 3006 閱讀 6841

1 陣列:

陣列佔據一塊連續記憶體,按順序儲存元素。定義陣列時,因為陣列中資料連續,需要事先指定陣列規模大小,根據大小分配記憶體。

由於陣列記憶體連續,可以在o(1)時間內讀/寫任何元素,因此可以用陣列來實現簡單的hash表。為解決陣列空間效率不高的問題,設計了多種動態陣列,比如vector。

陣列和指標的區別:

int getsize(int m)

int data = ;

int size1 = sizeof(data);//20,陣列大小

int* data1 = data;

int size2 = sizeof(data1);//4,指標大小

int size3 = getsize(data);//4,指標大小,陣列作為函式引數傳遞時,陣列作為指標使用。

關於陣列初始化:

1 指定陣列大小的初始化:

陣列型別陣列名[陣列大小] = ;

int i[10]=;

2 未指定大小的陣列的初始化:

當需要在宣告時初始化乙個陣列,我們還可以使用c++提供的自動計算陣列大小的功能,只要不指明陣列的大小即可。實際上,編譯器通過計算初始化資料的個數來建立乙個足夠大的陣列來儲存這些初始的資料。例如:

int nums= ;

3 動態定義陣列:

很多情況下,在預編譯過程階段,陣列的長度是不能預先知道的,必須在程式執行時動態的給出。但是問題是,c++要求定義陣列時,必須明確給定陣列的大小,要不然編譯通不過 。解決方案:用new開闢記憶體空間。如:

int array[5];正確

int i=5;

int array[i];錯誤,在編譯階段編譯器並不知道 i 的值是多少

int size=50;

int *p=new int[size]; 是正確的

char str1 = "hello";

char str2 = "hello";//1,2不同

char* str3 = "hello";

char* str4 = "hello";//3,4相同

3樹的常考知識點:

dfs和bfs

二叉搜尋樹,堆,紅黑樹

4演算法和資料操作

查詢:陣列有序,二分查詢

排序:時間複雜度,快排(遍歷非遍歷寫法)

5**的完整性:功能測試,邊界測試,負面測試

功能測試的時候,除了考慮普通的測試用例之外,一定要注意考慮是否溢位(大數問題),邊界測試在遞迴和迴圈中非常重要,錯誤輸入的處理(返回值,全域性變數,丟擲異常)

從右上角開始,如果當前數字大於目標,列減,如果當前數字小於目標,行加,相等,返回目標,否則查詢失敗。

在原來的字串上替換需要覆蓋和修改字串後面的記憶體,為了減少移動的次數,從後往前替換。

先遍歷一遍字串,統計出空格個數,計算出替換後字串的長度(原字串長度加上空格個數*2),設指標p1指向原字串末尾,p2指向新字串末尾:

如果p1指向空格:

string[p2–] = 『0』;string[p2–] = 『2』;string[p2–] = 『%』;p1–;(倒序)

否則:string[p2–] = string[p1–];直接拷貝

終止條件是:p1>=0並且p2>=p1

後進先出,棧實現;遞迴,每訪問乙個結點先遞迴輸出結點後面的結點,然後輸出該結點本身

根據前序遍歷和中序遍歷重建二叉樹

利用前序遍歷的第乙個結點就是根節點的值,掃瞄中序遍歷序列,確定根節點的值的位置,然後把前序序列和中序序列劃分為左子樹和右子樹序列,遞迴來求解。

進佇列:把元素壓如棧1

出佇列:如果棧2不為空,直接彈出棧2棧頂元素;如果棧2為空,把棧1壓入棧2,然後彈出棧2棧頂元素

旋轉陣列等價於兩個排序的子陣列,而且前面的子陣列大於後面的子陣列。這種一定程度上有序的陣列,可以考慮二分查詢的思路。

當第乙個元素大於等於最後乙個元素的時候,如果中間值大於等於第乙個元素,中間值位於前面的遞增陣列,第乙個元素索引等於中間值索引;如果中間值小於等於最後乙個元素,中間值位於後面的遞增陣列,最後乙個元素的索引等於中間值的索引。

重點是:考慮不旋轉的情況和重複元素的情況(順序查詢)

迴圈改遞迴,保留前兩項的解法。注意問題變形

基本解法:移位,與1。

問題:負數右移左邊的最高位補充的是1,這樣移位最後會陷入死迴圈。修改方法是把1不斷向左移動,判斷32次。

最優解法:n&(n-1)把乙個數最右邊的乙個1變為0,二進位制中有多少個1,就進行多少次這樣的操作

擴充套件:從m變到n,需要改變m二進位制中的多少位?

思路:先求亦或,再求亦或中1的個數

如果要刪除的結點不是尾結點:把該結點的下乙個結點的內容複製出來覆蓋被刪除的結點的內容,然後刪除下乙個結點。如果要刪除的結點是尾結點,分為只有乙個結點和多個結點的情況,其中多個結點只能順序刪除。

如果陣列中元素的相對位置可以改變,那麼設立兩個指標,乙個指向頭元素,乙個指向尾元素,讓頭指標指向偶數,尾指標指向奇數,然後交換。

如果要求相對位置不變,可以採用氣泡排序,前者為偶數,後者為奇數的情況兩兩交換相鄰元素。或者新建乙個陣列先把原陣列中的奇數push進去再把偶數push進去,然後用新陣列資料覆蓋原陣列即可。

重點:魯棒性,考慮鍊錶為空,k<=0,鍊錶節點數少於k的情況

雙指標來回

邊界條件:頭指標為空或者只有乙個結點時

反轉操作:三指標,不要出現斷層

遞迴呼叫,注意判斷兩個煉表頭指標是否為空

首先在a中查詢和b的根節點一樣的結點,注意檢查a或者b中為空的情況,然後判斷a中以r為根節點的子樹和b是否具有相同結構,通過遞迴來考慮。

前序遍歷每個結點,如果遍歷到的結點有子結點,交換它的左右子結點,最後得到樹的映象。

每一圈左上角的起點是start,從(0,0)開始,迴圈列印的條件是columns>startx*2並且rows>starty*2,注意四步列印的條件

如果下乙個數字是棧頂元素,直接彈出,否則繼續壓入。如果到最後都沒有找到下乙個需要彈出的數字,返回false

《劍指offer》讀書筆記(1)

簡歷中描述專案的star模型 situation 簡短的專案背景,比如專案的規模,開發的軟體的功能 目標使用者等。task 自己完成的任務。寫詳細,要讓面試官對你的工作一目了然。用詞上注意區分參與和負責。負責某個專案是指,理解專案的總體框架設計 核心演算法 團隊合作等問題。action 為了完成任務...

劍指offer讀書筆記(1)

1 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class solution else if array l i target else return false ...

劍指offer讀書筆記(2)

1 給定乙個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。public class solution 2 輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於位於陣列的後半部分,並保證奇數和奇...