春招筆記(七) 劍指offer3 9

2021-09-12 10:15:45 字數 2146 閱讀 4695

1.在乙個長度為 n 的陣列裡的所有數字都在 0 到 n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。

思路:要求是時間複雜度 o(n),空間複雜度 o(1)。因此不能使用排序的方法,也不能使用額外的標記陣列。

對於這種陣列元素在 [0, n-1] 範圍內的問題,可以將值為 i 的元素調整到第 i 個位置上進行求解。

以 (2, 3, 1, 0, 2, 5) 為例,遍歷到位置 4 時,該位置上的數為 2,但是第 2 個位置上已經有乙個 2 的值了,因此可以知道 2 重複

public boolean duplicate(int nums,int length,int duplication){

if(num == null || length <= 0){

return false;

for(int i=0;iwhile(num[i] != i){

if(nums[i]==nums[nums[i]])

duplication[0] = num[i];

reurn true;

swap(num,i,num[i]);

return  false;

private void swap(int num,int i,int j){

int t = nums[i];

num[i] = num[j];

num[j]=t;

2.給定乙個二維陣列,其每一行從左到右遞增排序,從上到下也是遞增排序。給定乙個數,判斷這個數是否在該二維陣列中。

解題思路:

要求時間複雜度 o(m + n),空間複雜度 o(1)。

該二維陣列中的乙個數,它左邊的數都比它小,下邊的數都比它大。因此,從右上角開始查詢,就可以根據 target 和當前元素的大小關係來縮小查詢區間,當前元素的查詢區間為左下角的所有元素。

3.將乙個字串中的空格替換成 "%20"。

解題思路:

在字串尾部填充任意字元,使得字串的長度等於替換之後的長度。因為乙個空格要替換成三個字元(%20),因此當遍歷到乙個空格時,需要在尾部填充兩個任意字元。

令 p1 指向字串原來的末尾位置,p2 指向字串現在的末尾位置。p1 和 p2 從後向前遍歷,當 p1 遍歷到乙個空格時,就需要令 p2 指向的位置依次填充 02%(注意是逆序的),否則就填充上 p1 指向字元的值。

從後向前遍是為了在改變 p2 所指向的內容時,不會影響到 p1 遍歷原來字串的內容。

4.從尾到頭反過來列印出每個結點的值。

1-》2-》3   output: 3->2->1

解題思路:

使用頭插法

利用煉表頭插法為逆序的特點。

頭結點和第乙個節點的區別:

頭結點是在頭插法中使用的乙個額外節點,這個節點不儲存值;

第乙個節點就是鍊錶的第乙個真正儲存值的節點。

使用棧

5. 重建二叉樹

根據二叉樹的前序遍歷和中序遍歷(左根右)的結果,重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

解題思路:

前序遍歷(根左右)的第乙個值為根節點的值,使用這個值將中序遍歷結果分成兩部分,左部分為樹的左子樹中序遍歷結果,右部分為樹的右子樹中序遍歷的結果。

6.二叉樹的下乙個結點

給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

7.用兩個棧實現佇列

用兩個棧來實現乙個佇列,完成佇列的 push 和 pop 操作。

in 棧用來處理入棧(push)操作,out 棧用來處理出棧(pop)操作。乙個元素進入 in 棧之後,出棧的順序被反轉。當元素要出棧時,需要先進入 out 棧,此時元素出棧順序再一次被反轉,因此出棧順序就和最開始入棧順序是相同的,先進入的元素先退出,這就是佇列的順序。

劍指offer(39)陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。設定乙個比較陣列 返回值即可 重複了就break public bo...

劍指offer 39 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先,什麼是平衡二叉樹?如果二叉樹中任意結點的左右子樹深度相差不超過1,那麼它就是平衡二叉樹。最直接的做法,遍歷每個結點,借助乙個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷。public class sol...

劍指offer39 平衡二叉樹

題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先要搞清楚什麼是平衡二叉樹 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。很直觀用遞迴來解決 coding utf 8 class treenode def init self,x self.va...