劍指 Offer 第三章總結與實現

2021-10-04 09:11:55 字數 4557 閱讀 1709

給定乙個 double 型別的浮點數 base 和 int 型別的整數 exponent。求 base 的 exponent 次方。不可使用庫函式,不用考慮大數問題。

考察**的完整性,不能覺得它簡單,要盡可能想的全面。

base 是 0,或者 exponent 是0

exponent 是乙個負值

快速冪遞迴的進行快速冪:

class solution 

if (exponent & 1)

return base * power(base*base, exponent >> 1);

else

return power(base*base, exponent >> 1);

}};

輸入數字 n,按順序列印出從 1 最大的 n 位十進位制數。比如輸入 3,則列印出 1、2、3 一直到最大的 3 位數即 999。

這裡需要考慮大數的問題,因為當 n 稍微大一點的時候,比如 十幾,用 int 就放不下了。這裡可以使用回溯法的思想,利用 string 儲存數字,一直去按順序探索路徑,每次探索的時候保留著字首。

void print(int n, string prefix)

return;

}for (int i = 1; i < 10; i ++)

}int main()

}cout << endl;

return 0;

}

在 o(1) 時間內刪除鍊錶節點,給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在 o(1) 時間內刪除該節點。

刪除鍊錶中的節點並不必須知道它的前乙個節點,分兩種情況考慮

要刪除的節點不是尾節點,把它後面的節點值複製到當前節點,然後把後面的節點刪除

如果是尾節點,沒辦法,只能從頭到尾遍歷一遍,時間複雜度為 o(n)

演算法的平均複雜度是 o(1)

在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5

為了使得處理統一,建立乙個空的頭指標

遍歷整個鍊錶,遍歷的同時保留住其上乙個節點,當遇到某乙個節點的值與其之後節點的值相同時,進入乙個 while 迴圈,不斷刪除掉與這個值相同的節點

class solution 

}else

}return newhead -> next;

}};

請實現乙個函式用來匹配包括 『.』 和 『*』 的正規表示式。模式中的字元 『.』 表示任意乙個字元,而 『*』 表示它前面的字元可以出現任意次(包含 0 次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"a.a" 和 「ab*ac*a」 匹配,但是與 「aa.a」 和 「ab*a」 均不匹配。

這題不難,主要是需要考慮的東西太多。

如果 pattern 的第二個字元為 *

如果不等的話,只能讓 pattern 往後走兩個

如果第二個字元不為 *

class solution 

else

else

return match(str, pattern + 2);}}

};

判斷乙個給定的字串是不是乙個有效的數字,比如,字串 「+100」,「5e2」,"-123",「3.1416」 和 「-1e-16」 都表示數值。 但是 「12e」,「1a3.14」,「1.2.3」,「±5」 和 「12e+4.3」 都不是。

用三個布林變數,分別表示是否見過符號,小數點,以及 e,有以下的判斷條件:

class solution  else if (str[i] == '+' || str[i] == '-')  else if (str[i] == '.')  else if (str[i] < '0' || str[i] > '9') // 不合法字元

return false;

}return true;

}};

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有的奇數字於陣列的前半部分,所有的偶數字於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。

如果不考慮相對位置的話,可以利用兩個指標,當前指標碰到偶數,後指標碰到奇數,交換兩者的位置。

這裡需要考慮相對的位置,那麼只能夠考慮別的方法。

可以通過插入排序的思想,去尋找待插入元素的位置。按順序去插入,如果是奇數的話,插入到陣列中奇數的最後(這個時候需要後面所有的偶數都往後搬),如果是偶數,插入到陣列的最後面(不需要移動元素)。

另一種方法是,從前往後掃瞄元素,如果碰到了乙個偶數,那麼在它的後面找奇數,如果全部是偶數,說明任務完成。找到奇數以後,讓這個奇數與它前面的元素交換位置,這裡必須相鄰的交換,不然會造成排序不穩定。

前兩種方法時間複雜度都是 o(n^2),空間複雜度 o(1)。還有一種可以 o(n) 時間完成的方法,空間複雜度也是 o(n)。先遍歷一遍陣列,統計奇數的個數,然後新建乙個陣列,保留奇數偶數兩個 idnex,奇數初始值為 1,偶數初始值為奇數的個數。然後將陣列按照奇偶數對應的複製過去。

class solution 

else

}if (exchange)

else}}

}};

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

用兩個指標,第乙個指標先往後走 k 步,然後兩個指標一起走,當第乙個指標走到頭時,第二個指標指向的就是倒數第 k 個節點。需要注意以下的情況:

class solution 

if (p != k) return null;

listnode* q = plisthead;

while(t)

return q;

}};

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。

設定快慢兩個指標,快指標一次走兩步,慢指標一次走一步。如果兩個指標相遇,說明鍊錶中是有環的。這時,讓其中乙個指標從頭開始走,當兩個指標再次相遇,這時就是鍊錶中環的起始節點。

class solution 

if (fast == null || fast -> next == null)

return null;

fast = phead;

while(fast != slow)

return fast;

}};

輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。

直接使用鍊錶的頭插法即可,記得自己 new 的空間,要自己 delete 掉,不然會記憶體洩漏(被面試的時候教的。。。)

第二種思路,遞迴實現。先反轉當前節點的下乙個節點。反轉完成以後,返回了煉表頭,當前節點的下乙個節點變成了鍊錶的末尾。然後把當前節點續到鍊錶末尾上。

第三種思路,直接修改指標。將當前節點的下乙個節點的 next 指向當前節點。

第一種思路:

class solution 

listnode* t = newhead -> next;

delete newhead;

return t;

}};

第二種思路:

class solution 

};

第三種思路:

class solution 

listnode* p = phead;

listnode* q = p -> next;

phead -> next = null;

while(q)

return p;

}};

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。

直接歸併排序。迭代比較好實現,遞迴的思想很巧妙。

第一種解法,迭代:

class solution 

else

t -> next = null;

p -> next = t;

p = p -> next;

}if(phead1)

if(phead2)

p = newhead -> next;

delete newhead;

return p;

}};

第二種解法,遞迴:

class solution else

}};

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)。需要注意子結構的定義,一棵樹是另外一棵樹的一部分即可,不一定要包含葉節點。

遞迴的進行,在 a 樹上的每個節點判斷,在這個節點上,b 樹是不是 a 樹的子樹。這個判斷也是乙個遞迴的過程。

class solution 

bool hassubtree(treenode* proot1, treenode* proot2)

};

《劍指offer》筆記 第三章 3

面試題21 調整陣列順序使奇數字於偶數之前 實現乙個函式,輸入乙個整數陣列,調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分 測試用例 功能測試 奇數偶數交替出現 全是奇數 偶數 所有偶數在奇數前 奇數在偶數前 特殊輸入 null 只有乙個數字的陣列 分析 1.維護...

《劍指offer》筆記 第三章 4

面試題24 翻轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭節點,翻轉該鍊錶並輸出翻轉後的頭節點。struct listnode 測試用例 功能測試 輸入的鍊錶含多個節點 乙個節點 特殊輸入 鍊錶是null 分析 2.翻轉後的頭指標要指向翻轉前的尾節點 翻轉後的尾節點的要指向null 面試題25 合併兩個排...

第三章總結

1.dom操作 1.1dom操作分類 1 dom core 2.html dom 3 css dom 1.2節點和節點關係 整個文件是乙個文件節點 每個html標籤是乙個元素節點。包含在html元素中的文字是文字節點 每個html屬性是乙個屬性節點 注釋屬於注釋節點 父節點與子節點的關係 在節點數中...