LeetCode每日一題(題1028)

2021-10-07 07:21:01 字數 2224 閱讀 8594

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在**。

從先序遍歷還原二叉樹

題目大意:

給出乙個字串"1-2–3--4-5–6--7",1代表節點的值,前面的-個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。

返回乙個二叉樹。

一看到樹的題目,首先就想到了使用遞迴。

這道題顯然是不斷遞迴生成子節點,那首先需要把一些值設定為全域性變數。

需要設定為全域性變數的值有

然後對於一次遞迴來說,首先要獲得當前節點的值。

這邊需要注意當前節點的值可能不止一位,那麼需要判斷當前位置的值是否為數字,如果是的話則儲存下來並且將index++,然後最後獲得乙個整數,同時要注意index不要越界了。

接下來判斷後面有多少個』-』,如果個數為當前deep+1,那說明是左子樹,進行遞迴。

如果不是,那麼說明是當前節點的兄弟節點,或者父節點的兄弟,總之說明該節點沒有子樹了,就需要返回。

對於右子樹來說也是同樣的操作。

這裡要注意index的值,不要越界了,一旦判斷index >= length就說明這是最後乙個節點,直接返回該節點。

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

public treenode pre

(int deep)

treenode node =

newtreenode

(val)

;for

(int i=

0;i) index += deep;

node.left =

pre(deep+1)

;for

(int i=

0;i) index += deep;

node.right =

pre(deep+1)

;return node;

}}

這次**中主要犯了如下錯誤:

void型別的方法中修改物件,我寫了如下**:

public

void

mian()

public

void

getleft

(treenode node)

在這個**我想實現生成乙個新的treenode並且賦值給root的左子樹。但是這樣並不能成功,root左子樹還是null

這是因為當我將root.left傳遞給子方法的時候,子方法生成了乙個區域性變數node,並且將node的位址設定為root.left的位址也就是null。

當我執行node = new treenode(0);的時候我把node的位址又修改為了新生成的節點的位址treenode@4141d797(這是我在idea中輸出的位址,實際不一定是這個)。

但是這個時候node.left依然還是null沒有得到修改,所以方法返回之後什麼也沒有發生。

正確的**寫法應該如下:

public

void

mian()

public treenode getleft()

這次錯誤的原理其實早就在書上看到過了,但是實際寫的時候還是犯了,果然是「紙上得來終覺淺,絕知此事要躬行」。

看了半天感覺沒什麼問題,一除錯就發現了問題所在,感覺非常睿智。

總之,今天的題得到了如下收穫:

想遞迴生成乙個新的物件,老老實實返回,不要用void方法然後在裡面生成。

看到字串整數的時候,一定注意整數長度可能不止一位,leetcode的題老是只給你一位整數誤導你,其實測試用例裡有好多多位整數,這個時候需要先獲得整個整數的位數然後再處理。

判斷index是否越界。

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

LeetCode每日一題(題139)

題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...

LeetCode每日一題(題378,題718)

題目大意 給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第 k 小的元素。請注意,它是排序後的第 k 小元素,而不是第 k 個不同的元素。分析 這道題我一開始以為是搜尋題,然後想了一會並沒有想出來,最後採用了轉換為1維陣列排序的方式。其實這道題的方法還是挺巧妙的,每次二分出...