Jan 14 2026
sevencoding -
劍指offer-64、滑動窗⼝的最⼤值
題⽬描述
給定⼀個數組和滑動窗⼝的⼤⼩,找出所有滑動窗⼝⾥數值的最⼤值。例如,如果輸⼊數組 {2,3,4,2,6,2,5,1} 及滑動窗⼝的⼤⼩ 3 ,那麼⼀共存在 6 個滑動窗⼝,他們的最⼤值分別為 {4,4,6,6,6,5} ;
針對數組 {2,3,4,2,6,2,5,1} 的滑動窗⼝有以下6個: {[2,3,4],2,6,2,5,1} , {2,[3,4,2],6,2,5,1} , {2,3
後端
Jan 13 2026
sevencoding -
劍指offer-63、數據流中的中位數
題⽬描述
如何得到⼀個數據流中的中位數?如果從數據流中讀出奇數個數值,那麼中位數就是所有數值排序之後位於中間的數值。如果從數據流中讀出偶數個數值,那麼中位數就是所有數值排序之後中間兩個數的平均值。我們使⽤ Insert() ⽅法讀取數據流,使⽤ GetMedian() ⽅法獲取當前讀取數據的中位數。
思路及解答
排序列表法
維護一個列表,每次獲取中位數前進行排序
import java.util.
後端
Jan 12 2026
sevencoding -
SPI機制:服務擴展的核心技術
為什麼需要SPI機制
SPI和API的區別是什麼
SPI是一種跟API相對應的反向設計思想:API由實現方確定標準規範和功能,調用方無權做任何干預; 而SPI是由調用方確定標準規範,也就是接口,然後調用方依賴此接口,第三方實現此接口,這樣做就可以方便的進行擴展,類似於插件機制,這是SPI出現的需求背景。
SPI : “接口”位於“調用方”所在的“包”中
概念上更依賴調用方。
後端
Jan 09 2026
sevencoding -
數據結構-圖
概述
圖是一種較為複雜的非線性結構。 為啥説其較為複雜呢?
根據前面的內容,我們知道:
線性數據結構的元素滿足唯一的線性關係,每個元素(除第一個和最後一個外)只有一個直接前趨和一個直接後繼。
樹形數據結構的元素之間有着明顯的層次關係。
但是,圖形結構的元素之間的關係是任意的。
何為圖呢? 簡單來説,圖就是由頂點的有窮非空集合和頂點之間的邊組成的集合。通常表示為:G(V,E),其中,G 表示
後端
Jan 08 2026
sevencoding -
劍指offer-61、序列化二叉樹
題⽬描述
請實現兩個函數,分別⽤來序列化和反序列化⼆叉樹
⼆叉樹的序列化是指:把⼀棵⼆叉樹按照某種遍歷⽅式的結果以某種格式保存為字符串,從⽽使得內存中建⽴起來的⼆叉樹可以持久保存。序列化可以基於先序、中序、後序、層序的⼆叉樹遍歷⽅式來進⾏修改,序列化的結果是⼀個字符串,序列化時通過 某種符號表示空節點( # ),以 ! 表示⼀個結點值的結束( value! )。
⼆叉樹的反序列化是指:根據某種遍歷
後端
Jan 07 2026
sevencoding -
劍指offer-60、將⼆叉樹打印成多⾏
題⽬描述
從上到下按層打印⼆叉樹,同⼀層結點從左⾄右輸出。每⼀層輸出⼀⾏。
給定的⼆叉樹是 {1,2,3,#,#,4,5} :
該⼆叉樹多⾏打印層序遍歷的結果是:
[
[1],
[2,3],
[4,5]
]
示例1
輸⼊:{8,6,10,5,7,9,11}
返回值:[[8],[6,10],[5,7,9,11]]
思路及解答
59題的縮減版
迭代法BFS(廣度優先搜索)
public
後端
Jan 07 2026
sevencoding -
劍指offer-60、將⼆叉樹打印成多⾏
題⽬描述
從上到下按層打印⼆叉樹,同⼀層結點從左⾄右輸出。每⼀層輸出⼀⾏。
給定的⼆叉樹是 {1,2,3,#,#,4,5} :
該⼆叉樹多⾏打印層序遍歷的結果是:
[
[1],
[2,3],
[4,5]
]
示例1
輸⼊:{8,6,10,5,7,9,11}
返回值:[[8],[6,10],[5,7,9,11]]
思路及解答
59題的縮減版
迭代法BFS(廣度優先搜索)
public
JAVA
Jan 06 2026
sevencoding -
劍指offer-59、按之字形順序打印⼆叉樹
題⽬描述
請實現⼀個函數按照之字形打印⼆叉樹,即第⼀⾏按照從左到右的順序打印,第⼆層按照從右⾄左的順序打印,第三⾏按照從左到右的順序打印,其他⾏以此類推。
示例1
輸⼊:{8,6,10,5,7,9,11}
返回值:[[8],[10,6],[5,7,9,11]]
思路及解答
雙向鏈表(推薦)
藉助雙向鏈表,初始化⼀個添加⽅向 boolean 值,先將根節點添加進去:
獲取 list
JAVA
,
後端
Jan 06 2026
sevencoding -
劍指offer-59、按之字形順序打印⼆叉樹
題⽬描述
請實現⼀個函數按照之字形打印⼆叉樹,即第⼀⾏按照從左到右的順序打印,第⼆層按照從右⾄左的順序打印,第三⾏按照從左到右的順序打印,其他⾏以此類推。
示例1
輸⼊:{8,6,10,5,7,9,11}
返回值:[[8],[10,6],[5,7,9,11]]
思路及解答
雙向鏈表(推薦)
藉助雙向鏈表,初始化⼀個添加⽅向 boolean 值,先將根節點添加進去:
獲取 list
JAVA
Jan 05 2026
sevencoding -
數據結構-堆
什麼是堆
堆是一種滿足以下條件的樹:
堆中的每一個節點值都大於等於(或小於等於)子樹中所有節點的值。或者説,任意一個節點的值都大於等於(或小於等於)所有子節點的值。
大家可以把堆(最大堆)理解為一個公司,這個公司很公平,誰能力強誰就當老大,不存在弱的人當老大,老大手底下的人一定不會比他強。這樣有助於理解後續堆的操作。
!!!特別提示:
很多博客説堆是完全二叉樹,其實並非如此,堆不一定是完
後端
Jan 05 2026
sevencoding -
數據結構-堆
什麼是堆
堆是一種滿足以下條件的樹:
堆中的每一個節點值都大於等於(或小於等於)子樹中所有節點的值。或者説,任意一個節點的值都大於等於(或小於等於)所有子節點的值。
大家可以把堆(最大堆)理解為一個公司,這個公司很公平,誰能力強誰就當老大,不存在弱的人當老大,老大手底下的人一定不會比他強。這樣有助於理解後續堆的操作。
!!!特別提示:
很多博客説堆是完全二叉樹,其實並非如此,堆不一定是完全二叉
JAVA
Jan 04 2026
sevencoding -
劍指offer-58、對稱二叉樹
題⽬描述
請實現⼀個函數,⽤來判斷⼀棵⼆叉樹是不是對稱的。注意,如果⼀個⼆叉樹同此⼆叉樹的鏡像是同樣
的,定義其為對稱的。
例如:下⾯這棵⼆叉樹是對稱的
下⾯這個就不是對稱的:
示例1
輸⼊:{8,6,6,5,7,7,5}
返回值:true
示例2:
輸⼊:{8,6,9,5,7,7,5}
返回值:false
思路及解答
遞歸
遞歸,先判斷根節點是否為空,不為空則判斷左右⼦樹是
後端
Jan 04 2026
sevencoding -
劍指offer-58、對稱二叉樹
題⽬描述
請實現⼀個函數,⽤來判斷⼀棵⼆叉樹是不是對稱的。注意,如果⼀個⼆叉樹同此⼆叉樹的鏡像是同樣
的,定義其為對稱的。
例如:下⾯這棵⼆叉樹是對稱的
下⾯這個就不是對稱的:
示例1
輸⼊:{8,6,6,5,7,7,5}
返回值:true
示例2:
輸⼊:{8,6,9,5,7,7,5}
返回值:false
思路及解答
遞歸
遞歸,先判斷根節點是否為空,不為空則判斷左右⼦樹是
JAVA
Dec 31 2025
sevencoding -
劍指offer-57、二叉樹的下一個節點
題⽬描述
給定⼀個⼆叉樹和其中的⼀個結點,請找出中序遍歷順序的下⼀個結點並且返回。注意,樹中的結點不僅包含左右⼦結點,同時包含指向⽗結點的指針。
複雜的節點結構如下:
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = nu
後端
Dec 31 2025
sevencoding -
劍指offer-57、二叉樹的下一個節點
題⽬描述
給定⼀個⼆叉樹和其中的⼀個結點,請找出中序遍歷順序的下⼀個結點並且返回。注意,樹中的結點不僅包含左右⼦結點,同時包含指向⽗結點的指針。
複雜的節點結構如下:
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNo
JAVA
Dec 30 2025
sevencoding -
劍指offer-56、刪除鏈表中重複的節點
題⽬描述
在⼀個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表 1-2-3-3-4-4-5 處理後為 1-2-5
示例1
輸⼊:{1,2,3,3,4,4,5}
返回值:{1,2,5}
思路及解答
hash統計
第一次遍歷統計頻率,第二次遍歷刪除重複節點
import java.util.HashMap;
public class
後端
Dec 30 2025
sevencoding -
劍指offer-56、刪除鏈表中重複的節點
題⽬描述
在⼀個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表 1-2-3-3-4-4-5 處理後為 1-2-5
示例1
輸⼊:{1,2,3,3,4,4,5}
返回值:{1,2,5}
思路及解答
hash統計
第一次遍歷統計頻率,第二次遍歷刪除重複節點
import java.util.HashMap;
public class
JAVA
Dec 29 2025
sevencoding -
回溯算法總結
概述
其實回溯算法和我們常説的 DFS 算法非常類似,本質上就是一種暴力窮舉算法。回溯算法和 DFS 算法的細微差別是:回溯算法是在遍歷「樹枝」,DFS 算法是在遍歷「節點」
抽象地説,解決一個回溯問題,實際上就是遍歷一棵決策樹的過程,樹的每個葉子節點存放着一個合法答案。你把整棵樹遍歷一遍,把葉子節點上的答案都收集起來,就能得到所有的合法答案。
站在回溯樹的一個節點上,你只需要思考 3 個問題:
後端
Dec 29 2025
sevencoding -
回溯算法總結
概述
其實回溯算法和我們常説的 DFS 算法非常類似,本質上就是一種暴力窮舉算法。回溯算法和 DFS 算法的細微差別是:回溯算法是在遍歷「樹枝」,DFS 算法是在遍歷「節點」
抽象地説,解決一個回溯問題,實際上就是遍歷一棵決策樹的過程,樹的每個葉子節點存放着一個合法答案。你把整棵樹遍歷一遍,把葉子節點上的答案都收集起來,就能得到所有的合法答案。
站在回溯樹的一個節點上,你只需要思考 3 個問題:
JAVA
Dec 26 2025
sevencoding -
動態規劃
什麼是動態規劃
動態規劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動態規劃是最有效的。
所以動態規劃中每一個狀態一定是由上一個狀態推導出來的,這一點就區分於貪心,貪心沒有狀態推導,而是從局部直接選最優的,
例如:有N件物品和一個最多能背重量為W 的揹包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品只能用一次,求解將
後端
Dec 26 2025
sevencoding -
動態規劃
什麼是動態規劃
動態規劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動態規劃是最有效的。
所以動態規劃中每一個狀態一定是由上一個狀態推導出來的,這一點就區分於貪心,貪心沒有狀態推導,而是從局部直接選最優的,
例如:有N件物品和一個最多能背重量為W 的揹包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品只能用一次,求解將
JAVA
Dec 25 2025
sevencoding -
劍指offer-55、鏈表中環的⼊⼝節點
題⽬描述
給⼀個鏈表,若其中包含環,請找出該鏈表的環的⼊⼝結點,否則,輸出null 。
例如,輸⼊{1,2},{3,4,5} 時,對應的環形鏈表如下圖所示:
可以看到環的⼊⼝結點的結點值為3,所以返回結點值為3的結點。
給定的鏈表節點的結構:
public class ListNode {
int val;
ListNode next = null;
ListNode(i
後端
Dec 25 2025
sevencoding -
劍指offer-55、鏈表中環的⼊⼝節點
題⽬描述
給⼀個鏈表,若其中包含環,請找出該鏈表的環的⼊⼝結點,否則,輸出null 。
例如,輸⼊{1,2},{3,4,5} 時,對應的環形鏈表如下圖所示:
可以看到環的⼊⼝結點的結點值為3,所以返回結點值為3的結點。
給定的鏈表節點的結構:
public class ListNode {
int val;
ListNode next = null;
ListNode(i
JAVA
Dec 24 2025
sevencoding -
劍指offer-54、字符流中第一個不重複的字符
題⽬描述
請實現⼀個函數⽤來找出字符流中第⼀個只出現⼀次的字符。例如,當從字符流中只讀出前兩個字符" go "時,第⼀個只出現⼀次的字符是" g "。當從該字符流中讀出前六個字符“ google "時,第⼀個只出現⼀次的字符是" l "。
返回值描述:如果當前字符流沒有存在出現⼀次的字符,返回 # 字符。
思路及解答
有序哈希表
可以直接使用哈希的數據結構來存取我們的字符,對與重複的字符可以對值進
後端