我所理解的要點和難點 劍指offer簡要筆記

2021-07-28 09:09:34 字數 2314 閱讀 5482

1、singleton模式。設計乙個類,只能生成該類的乙個例項

考慮多執行緒環境,加同步鎖。

2、替換空格。把字串中每個空格換成「%20」

從字串的後面開始複製和替換,準備兩個指標,p1指向原始字串末尾,p2指向替換之後的字串末尾。

3、從尾到頭列印鍊錶

方法1:棧  方法2:遞迴

4、重建二叉樹。已知前序遍歷和中序遍歷

前序遍歷第乙個節點是根結點,中序遍歷根結點左邊為左子樹的結點,右邊為右子樹的結點;

通過遞迴構建左右子樹

binarytreenode * constructcore(int*startpreorder,int* endpreorder,int* startinorder,int* endinorder);

5、兩個棧實現佇列。(兩個佇列實現棧)

stack.push(element);

templatetcqueue::deletehead()

通過自定義的比較函式來實現:兩個數字m和n能拼成mn和nm,比較這兩個數的大小來確定m和n的大小。

17、求第n個醜數(只包含因子2、3和5的數)

建立陣列儲存已經找到的醜數,用空間換時間的解法。

18、第一次只出現一次的字元:利用雜湊表,時間複雜度o(n)

19、求陣列中的逆序對

利用歸併排序的方法,時間複雜度為o(nlogn),同時需要乙個長度為n的輔助陣列。

20、數字在排序陣列中出現的次數

順序掃瞄的時間複雜度為o(n)

通過二分查詢第乙個出現的需查詢數字和最後乙個出現的需查詢數字的下標;

然後計算下標差,就能得到該數出現的次數。時間複雜度為o(logn)。

21、陣列中只出現一次的數字

乙個整型陣列除了兩個陣列之外,其他的陣列都出現了兩次,找出這兩個數字。要求時間複雜度為o(n),空間複雜度為o(1)

方法:首先從頭到尾異或,異或結果的二進位制表示中至少有一位為1;

以第n位是不是1為標準把原陣列分為兩個陣列;

出這兩個數字。

22、不用加減乘除做加法

while(num2 != 0){

sum = num1^num2;

carry = (num1 & num2);

num1 = sum;

num2 = carry;

return num1;

23、c++中,成員變數的初始化順序只與它們在類中的宣告順序有關,而與在建構函式的初始化列表的順序無關。

24、輸入兩個結點,求它們的最低公共祖先

分三種情況:1.該樹是二叉搜尋樹時,樹中從上到下第乙個在兩個輸入結點的值之間的結點,就是最低公共祖先;

2.樹中有指向父結點的指標pparent,則轉換成求兩個鍊錶的第乙個公共結點;

3.該樹是普通的樹,則通過輔助記憶體,得到到某一結點的路徑,然後求出這兩條路徑的最後公共結點。

25、陣列中重複的數字

方法1:排序     方法2:雜湊表(需要輔助記憶體)    方法3:比較當前值和下標是否相等

26、字串中第乙個不重複的字元

利用雜湊表(256),第一次遍歷統計不同字元個數,第二次遍歷找出第乙個值為1的字元。

27、鍊錶中環的入口結點

(1)指標p1和p2初始化時指向鍊錶的頭結點;(2)通過一快一慢指標,從相遇結點出發,統計環中結點個數nodes,然後p1先在鍊錶中移動nodes步;(3)p1和p2再同時移動,直到相遇,相遇結點就是環的入口結點。

28、刪除鍊錶中重複的結點

考慮頭結點可能與後面的結點重複,因此刪除函式應該宣告為:

void deleteduplication(listnode** phead)而不是voiddeleteduplication(listnode* phead)

29、二叉樹中序遍歷的下乙個結點(有左右子結點的指標和有乙個指向父結點的指標)

如果結點有右子樹,則它的下乙個結點是它右子樹中的最左子結點;

如果沒有右子樹,而且結點是它父結點的左子結點,那麼下乙個結點就是父結點;

如果沒有右子樹,而且是它父結點的右子結點,則一直向上遍歷,直到乙個是它父結點的左子結點。如果這樣的結點存在,那麼這個結點的父結點就是要找的下乙個結點。

30、二叉樹列印成多行

利用queue進行層序遍歷;設乙個變數表示當前層還沒列印的結點數,另乙個變數表示下一層結點的數目。

31、按之字列印二叉樹

利用兩個棧來實現。

我所理解的call和apply

一 先來看看示例 這兩個方法的用途都在特定的作用域中呼叫函式,實際上等於設定函式體內this物件的值。例一 123 4567 891011 1213 1415 function box num1,num2 function sum num1,num2 alert sum 10,10 function...

劍指off 求1到n的代數和

題目 求1到n的代數和,不能使用if else while for switch case 分析 這個東西要用迭代來控制,應該是迴圈或者是遞迴,但是迴圈的or 和 while都不給用,遞迴只要也需要if來控制結束。第一種方法是利用,類的靜態成員變數被類的所有例項共有 class temp stati...

我理解的劍指Offer 反轉鍊錶

題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。輸入 輸入可能包含多個測試樣例,輸入以eof結束。對於每個測試案例,輸入的第一行為乙個整數n 0 n 1000 代表將要輸入的鍊錶的個數。輸入的第二行包含n個整數t 0 t 1000000 代表鍊錶元素。輸出 對應每個測試案例,以此輸出鍊錶反轉...