LeetCode - 刷題之旅的總結與心得
前言
這裡是我寫Leetcode總結核心概念的地方,不同的情境會使用到的武器不同,這裡我會描述在什麼樣的情境滿足下,適合的資料結構或是演算法。而這個演算法的核心概念是什麼,同時我也會紀錄一些我在刷題時的心得,以及刷題的時間,來慢慢看到成長與進步。
Leetcode時間紀錄
Hash Table
情境1: 快速找元素
通常使用 Hash 的關鍵在於要用 O(1) 的時間複雜度來查找元素,這樣就可以不用遍歷整個 list 從 O(n) 變成 O(1) 的時間內完成整個問題。
相關題目:
leetcode-1-two-sum: 給定一個 target 數值,從 list 中找到兩個數字相加等於 target
leetcode-12-integer-to-roman: 整數轉羅馬數字
leetcode-13-roman-to-integer: 羅馬數字轉整數
情境2: 比對無序的東西
如果要比對兩個無序的東西,像是兩個字串是否是 Anagram,這時候可以使用 Hash 來記錄每個字元出現的次數,然後比對兩個 Hash 是否相同。
相關題目:
leetcode-49-group ...
使用 Terraform 建立 GKE 叢集 - 從無到有建立 Google Kubernetes Engine 叢集 + Nginx Load Balancer + 測試
前言
今天要來介紹的是如何用 Terraform 建立 Google Kubernetes Engine,如果對使用 Terraform 建立、修改和刪除的指令不清楚可以參考我之前的文章 Terraform 基本操作,這篇文章主要是要介紹如何使用 Terraform 建立 GKE 叢集,並且建立 Nginx Load Balancer 來做為服務的入口,最後再透過 kubectl 來部署一個簡單的應用程式來測試負載平衡器是否正常運作。同時也會介紹要怎麼撰寫 Google Kubernetes Engine tf 檔案,應該參考什麼網站。
GKE 結構
GKE 的結構是: 叢集(cluster) > 節點池(node_pool) > 節點(node)
叢集
叢集是 Kubernetes 的核心單位,包含所有管理與執行工作負載所需的資源。它是由一組節點組成的容器管理平台。
節點池
節點池是一組具有相同配置的節點(虛擬機),是叢集資源的計算單位。
節點池內的所有節點使用相同的規格,例如機型、磁碟類型、映像類型等。
在 GKE 中,一個叢集可以有多個節點池。
節點
節點是 ...
Terraform 新手介紹 - 一篇立刻搞懂 Terrafrom 的核心與基礎元件
介紹
Terraform 是由 HashiCorp 開發的一種IaC管理工具,其誕生的原因來自現代 IT 基礎設施管理中對自動化、可重複性和跨平台支持的需求。隨著雲計算的普及,企業的基礎設施變得越來越動態,管理多雲環境(如 AWS、Azure、Google Cloud)和本地數據中心的資源變得複雜且容易出錯。傳統的手動配置方式不僅效率低,還容易導致環境之間的不一致。
Terraform 的產生主要為了解決以下需求:
基礎設施即代碼 (IaC):提供一種編程式方法來定義和管理基礎設施,使得資源配置版本化、可審核,並易於復現。
多雲支持:允許用戶通過單一工具管理不同雲平台和供應商的資源,避免過度依賴單一供應商。
可重複性和自動化:使用代碼編寫一次配置,無論是測試環境還是生產環境都可以一致地部署資源。
依賴管理:Terraform 能夠分析基礎設施資源之間的依賴關係,按正確順序創建或刪除資源,減少人為錯誤。
因此,Terraform 的出現使企業能夠更高效地管理和運營現代化的基礎設施,同時加強了敏捷性和穩定性。使用Terrafrom我們就不需要手動去建立或是刪除某個資源,只需要寫好腳本, ...
LeetCode #200 Number of Islands - 刷題之旅
1 題目描述
一個二維數組,把 1 看做陸地,把 0 看做大海,陸地相連組成一個島嶼。把陣列以外的區域也看做是大海,問總共有多少個島嶼。
Constraints:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] is '0' or '1'
2 解法
這個解法主要有兩個:
DFS:就是深入檢查每個node是否有相連,如果有就把相連的部分都變成0,直到沒有相連的部分為止。
併查集 Disjoint-set data structure: 利用尋找root的方式,如果發現有共同的祖先,那就表示這兩個land是相連的,如果是不同的root就代表不同祖先,可能要建立bridge或是union合併。
DFS的方法比較簡單明瞭,併查集的方法比較複雜,但是很有趣,所以我兩個都會來說明如何實現。
2.1 DFS
基本上在上下左右探索的時候,要確保三個原則:
不要超出rows邊界
不要超出cols邊界
不要走到海洋
1234567891011def dfs(i, j): # (不要超過 row ...
Kubernetes - Replica 的幾種 Controller 比較 [Replication Controller vs ReplicaSet vs Deployment vs DaemonSet]
介紹
Replication Controller:確保有「固定數量」的 Pod 在運行。
ReplicaSet:和 Replication Controller 類似,但更靈活,可使用標籤篩選Pod,負責管理 Pod 的數量。
Deployment:管理和控制 ReplicaSet,讓你可以輕鬆升級、回滾和更新 Pod。
DaemonSet:確保每一台機器上都運行一個 Pod,適用於需要在每個 Node 上執行的服務。
Replication Controller
Replication Controller (RC)
Replication Controller 就像是一個「監視員」,它的工作是確保 Kubernetes 集群中有指定數量的 Pod 在運行。
想像你開了一家餐廳,你希望廚房裡總是有 3 位廚師在工作。Replication Controller 就是那個一直在監視廚房的人,如果發現少了廚師(Pod 故障了),它就會立刻找一個新的來補上。
同樣地,如果多出來的廚師(Pod)不需要,Replication Controller 也會請多餘的廚師離開,確保始終保 ...
Kubernetes - 手把手教你搭建EFK日志收集系统於Kubernetes + 踩坑紀錄
前言
如果你需要在Kubernetes上搭建EFK日志收集系統,這篇文章將會是你的最佳選擇。本篇文章將會帶你一步一步的搭建EFK日誌收集系統,並且會分享一些踩坑紀錄。整個文章的蓋架構如下:
從上圖來看,這就是我們要搭建的EFK日誌收集系統。主要有以下工作:
建立 NFS Provisioner 服務:
因為我們希望每次加入一個節點於Kubernetes集群時,都能夠自動在新的節點中建立ElasticSearch,也就是說每個節點都會有一個ElasticSearch駐守,而這群ElasticSearch會形成一個叢集。
然而,每個ElasticSearch都需要儲存資料,因此我們需要一個共享的儲存空間,這個共享的儲存空間就是NFS。
而NFS Provisioner就是可以根據ElasticSearch建立起時,發送一個NFS PVC,那Provisioner就會根據PVC建立一個NFS PV,並且將PV掛載到ElasticSearch的Pod中。
建立 ElasticSearch:
ElasticSearch是一個分散式的搜尋引擎,我們將會在Kubernetes上建立一個E ...
Kubernetes - 手把手教你如何在 Kubernetes 中建置 CI/CD - GitLab CI + Argo CD
0 介紹
因為非常好奇通常怎麼在Kubernetes環境中建置CI/CD環境,因此我決定自己動手試試看,這篇文章將會介紹如何在Kubernetes中建置CI/CD環境,我們將會使用GitLab CI來建置CI環境,並且使用Argo CD來建置CD環境。
前提概要
在開始本篇文章前,我們假設你已經間至少以下環境:
Kubernetes 集群中的多個節點
已經安裝好 GitLab
已經在 Kubernetes 中建置好GitLKab Runner,詳細可以參考GitLab Runner Helm Chart
GitLab, Harbor 建置
如果 2 還沒建置好,可以參考以下連結,會教你如何建置Harbor、GitLab:https://github.com/ShannonHung/VMWare-CICD/tree/main/CICD
GitLab Runner 建置
如果 3 還沒建置好,可以參考以下連結,會教你如何建置GitLab Runner:https://docs.gitlab.com/runner/install/kubernetes.html
123helm repo ...
Kubernetes - 關於 Service 的介紹
介紹
Kubernetes 中的 Service 是一種資源,說他是資源是因為它是一種 Kubernetes 提供的 API 物件,通過描述和管理網路訪問來控制 Pods 的互動和連接方式。而Service用於將一組執行相同工作的容器 (Pods) 暴露為一個網路服務。
其存在的主要目的是提供一個穩定的網路介面
讓應用程序或其他 Pods 能夠方便地相互通訊,即使 Pod 隨著時間可能會發生變化(例如重新啟動、擴展或縮減)。更具體一點,Service可以達到以下功能:
提供固定的訪問入口:Pods 是動態的,IP 可能會變動,但 Service 會提供一個固定的 IP 和 DNS 名稱,讓其他服務或應用可以持續連接,不受 Pods IP 變化的影響。
負載平衡:當多個 Pods 提供相同的功能時,Service 會自動分配流量給這些 Pods,確保請求被平均分配,避免單個 Pod 承受過多壓力。
解耦:Service 將應用程序的網路流量相關設定 與 Pod 的具體運行位置分離。簡單來說,你設定好Service之後,不管你擴展、縮減或是重新部署Pods,Service 都會自動根據你 ...
LeetCode #86 Partition List - 刷題之旅
1 題目描述
有一個linked list,要求將linked list中小於x的node放在前面,大於等於x的node放在後面。
2 解法
這題不難,可以直接使用兩個linked list,一個是小於x的linked list,一個是大於等於x的linked list,最後再將兩個linked list合併即可。
123456789101112131415161718192021222324252627282930class Solution: def partition(self, head: Optional[ListNode], x: int) -> Optional[ListNode]: # 建立兩個虛擬頭節點,分別用於小於x的節點和大於等於x的節點 small_head = ListNode(0) large_head = ListNode(0) # 當前指針指向小鏈表和大鏈表的頭節點 small = small_head large = large_head ...
LeetCode #61 Rotate List - 刷題之旅
1 題目描述
給定一個鍊錶,將鍊錶向右旋轉 k 步,其中 k 是非負數。
2 解法
看到這個題目的時候,有想到如果今天k很大,這個linked list多少步驟會回到原本的樣子?基本上是當 k 是 鍊錶長度的倍數時,鍊錶會回到原本的樣子,因此我們可以先計算出鍊錶的長度,然後取餘數,這樣就可以得到我們要旋轉的步數。
當last.next是空的時候,表示觸底
12345678# 先計算長度last, count = head, 1while (last.next): count += 1 last = last.next# 重新計算k取餘數k = k % count
接下來如果k是2,代表最後面的兩個node會被擠到最前面,因此我們主要有兩個步驟:
找到last,把last跟head連接起來
找到新的head,把新head的前一個node的next設為None
12345678910# 找到last,把last跟head連接起來last.next = head# 找到新head的前一個node (從上圖例子為4)tmp = headfor _ in range(c ...