記錄劍指offer

2021-10-08 10:34:11 字數 3822 閱讀 8073

1.四種與型別轉換相關的關鍵字(p23)

type conversions

2.單例模式設計(p32) todo

單例模式設計

在真實的面試中有被問到過

餓漢式 多執行緒安全

//餓漢式(在定義例項的時候就去new物件)以空間換時間

class

csingleton

private

:class

garbage

// 它的唯一工作就是在析構函式中刪除 csingleton的例項 }}

;csingleton()

;static csingleton * m_pinstance;

static garbage garbage;

// 定義乙個靜態成員,在程式結束時,系統會呼叫它的析構函式 };

csingleton* csingleton::m_pinstance =

newcsingleton()

; csingleton::garbage csingleton::garbage;

以上**參考文章

3.陣列中的重複數字

交換陣列中的數字,以下標為索引,放到對應的位置中。

若保持陣列不變,則二分選擇數字進行統計,若數字大就繼續二分。

4.二維陣列的查詢

從右上找,則可以丟棄一列或一行。

5.替換空格

先數出空格數,resize字串的大小,再從後往前進行替換。

6.從尾到頭列印鍊錶

遞迴或者用棧。

stl棧操作stacka; cout<7.重建二叉樹

根據前序遍歷拿到根節點,根據中序遍歷區分左右子樹的節點,遞迴操作。

若有右子樹

右子樹最左邊的乙個節點

若沒有右子樹,且是父節點的左節點

父節點若沒有右子樹,且是父節點的右節點

向上找到第乙個是父節點的左節點的節點,若無則無

9.兩個棧實現乙個佇列

有兩個棧s1,s2

資料總是push進s1,總是從s2pop出來;

若s2為空,則把s1的全部逆序移進去,

s2裡面的資料倒騰兩次被pop出來就是先進先出了。

兩個佇列實現乙個棧

兩個佇列q1,q2

資料總是進入有資料的佇列中,總彈出有資料的最後乙個。

10.斐波那契數列

用迴圈代替迭代

青蛙跳台階問題,填滿矩陣問題

----------快排

partition操作

與標準作比較,小的話就++,並交換;

最後++,並交換。

參考劍指offer書上**

11.旋轉陣列的最小數字

兩個指標二分

但是存在特殊情況 只能遍歷處理

12.矩陣中的路徑

a.可以從任意位址開始,則主函式裡面有乙個兩層的for迴圈,依次判斷。

b.回溯部分,終止條件是字串匹配結束。

c.回溯過程中,先改狀態,進行回溯,成功則返回成功,失敗則恢復,返回失敗。

運用回溯法 分享乙個博主的關於回溯的部落格

回溯演算法——從leetcode題海中總結常見套路

13.機械人的運動範圍

起點唯一,如果滿足要求則返回1+回溯情況,否則返回0。

14.剪繩子

動態規劃,切割為子問題計算。

貪婪演算法,求因數3計算。

15.二進位制中1的個數

11001中有3個1

11001-1=11000與11001=11000

11000-1=10111與11000=10000

10000-1=01111與10000=0

三次變為0,則有三個1.

減1再與,最右一變零。

[2的整數次方] 只有乙個1

[m,n需要改變多少位相等] 異或求1的個數

16.數值的整數次方

1、-1、0關鍵數字直接返回

注意負數的絕對值大於正數的絕對值

快速冪 折半求

17.列印1到最大的n位數

用字串表示大數的方法

注意最大的進製處理 進製標誌處理

列印大數不列印前面的零

18.刪除鍊錶的節點

直接複製後面的節點內容到刪除節點,然後刪除此節點。

注意若為最後乙個節點,則需要找到前乙個節點刪除。

while(p->next!=tobedeleted){}

若為頭節點,則直接刪除。

刪除鍊錶中的重複節點

直接遍歷,先得到下一節點,如果相同則刪除此值的所有節點。

19.正規表示式todo

20.表示數值的字串todo

21.調整陣列順序使奇數字於偶數前面

兩個指標,分別指向不滿足條件的前後位置,然後交換。

停止條件是i22.鍊錶中倒數第k個節點

先找到節點個數,然後派兩個快慢指標。

乙個走到倒數k,乙個則走到末端。

23.鍊錶中的環入口節點

快慢指標找到環中的節點,然後乙個指標在環中走找到環的大小,最後兩個快慢指標找到入口。

24.反轉鍊錶

有乙個pre,有乙個ne,有乙個node。

ne=node->next;

node->next=pre;

pre=node;

node=ne;

注意判斷最後乙個節點指定為頭節點。

25.合併兩個排序的列表

這道題用迭代,**十分簡單。

如果乙個為空直接返回另外乙個。

如果都不為空,則建立乙個小的值的節點,next等於剩下的合併。

26.樹的子結構

有兩個函式,乙個判斷是否有子樹,乙個判斷是否是子樹。

是否有子樹:值相等則進行是否是子樹的操作,不相等則判斷左右節點是否有子樹。

是否是子樹:子樹為空,則返回true;否則相等判斷接下來的子樹,不相等返回false。

double絕對值小於0.0000001

27.二叉樹的映象

迭代,左右子樹交換,然後對左右子樹映象。

28.對稱的二叉樹

迭代,寫乙個兩個引數的對稱函式。

對左右子樹分別判斷,若都為空則true,若有乙個為空則false。

29.順時針列印矩陣

與乘以2做對比,得到列印幾圈。

然後分別列印。

30.包含min函式的棧

維護兩個棧。

push進去的時候若min沒有或者x比min小則push x,

否則push min進去。

31.棧的壓入、彈出序列

按照壓入順序不停的往裡面壓入,棧的top有與彈出佇列相同的元素則不停的彈出。

最後判斷棧中的元素個數。

32.從上到下列印二叉樹

a.不分行

先進先出 用佇列 存節點

b.分行

用兩個引數來存當前行元素個數和下一行元素個數

c.之字列印

用兩個棧來存 判斷奇偶行儲存方式不一樣 第二行左右 第三行右左

33.二叉搜尋樹的後序遍歷序列

根據最後乙個數,將前面分為兩部分,判斷是否都大或者都小,然後再分別遞迴判斷兩個區間。

34.二叉樹中和為某一路徑的值

dfs遍歷到葉節點的時候進行判斷。

35.複雜鍊錶的複製

a.hash來做 unordered_map

b.先複製到後一位,再給random賦值,再解開鍊錶,並還原。

劍指offer學習記錄

原碼 機器碼 反碼 除符號位,各位取反 補碼 反碼加一 此時沒有符號位的概念,即符號位也參與運算 例子 於是補碼的出現,解決了0的符號以及兩個編碼的問題 1 1 1 1 0000 0001 原 1000 0001 原 0000 0001 補 1111 1111 補 0000 0000 補 0000 ...

劍指offer 難題記錄

將最近幾天遇到的難題,整理記錄下來,以備複習!記錄兩個有趣的 csdn排行第一部落格和左耳朵陳浩關於fork 一 正規表示式匹配 本文參考 正規表示式 題目描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配...

劍指 offer 刷題記錄

任誰都躲不過找工作的問題,好希望能多準備一些時間,奈何時間不等人,每天刷幾道題,並且記錄下來吧 def replacespace s write code here num space 0 new s for i in range len s if i num space 1 for i in ra...