LeetCode 242. Valid Anagram
題目:
官網題目連結
根據題目敘述,會給定兩個字串 s 和 t,你必須判斷 s 是不是 t 的 anagram,若是則回傳 true,不是則回傳 false。
s 必須符合以下兩個條件才能算是 t 的 anagram :
s 和 t 字串長度相同
s 和 t 有相同的字元數且各字元出現次數相同
例如輸入 s = “anagram”, t = “nagaram”,應回傳 true。
輸入 s = “rat”, t = “car”,則回傳 false
1 <= s.length, t.length <= 5*10^4
s 和 t 都只由小寫英文字組成。
解法:
原本想到的作法是遍歷 s 並記錄 s 中各字母出現次數,之後再遍歷 t 並用紀錄的陣列去減,如果有新字母或出現次數變成負數的情況就代表兩者不相同,但這樣做會導致最差情況(s 是 t 的 anagram)必須遍歷兩次 s 長度。
後來發現其實根本不需要分開遍歷,因為你可以從記錄 s 變成紀錄兩者差距,也就是 s 有的就加,t 有的就減,這樣你就只需要遍歷找完的字母出現次數差異陣列,發現有字母出現次數不等於 0 ...
LeetCode 217. Contains Duplicate
題目:
官網題目連結
根據題目敘述,會給定一個整數陣列 nums,你必須判斷 nums 中是否有元素值是重複出現的,若有則回傳 true,沒有則回傳 false。
例如輸入 nums=[1, 2, 3, 1],由於元素值 1 重複出現,所以回傳 true。
而若輸入 nums=[1, 2, 3, 4],由於元素值都沒有重複出現,所以回傳 false。
1 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
解法:
這題比 TwoSum 更簡單,因為我們不需要知道重複的元素分別在哪裡,只需要知道當檢查到重複元素值時就回傳 true 就好。
所以一樣可以花一點空間來換時間,也就是用另一個陣列來邊找邊記錄我們已找過的值,當發現 nums[i] 已經有找過時,就代表要回傳 true。
時間複雜度 O(N),如何證明檢查存在鍵與拿取存放的時間複雜度請 參考我的另一篇文章 - PHP Array
空間複雜度 O(N)
PHP 程式碼:
我的解答
單元測試
LeetCode 1. Two Sum
題目:
官網題目連結
最經典的 LeetCode 第一題,求兩數之和!
根據題目敘述,會給定一個整數陣列 nums,還有一個整數 target,你必須找出 nums 中哪兩個元素相加會等於 target,用陣列回傳他們的索引。
例如輸入 nums=[2, 7, 11, 15], target=9,由於前兩個元素 2+7=9 剛好就是答案,所以回傳 [0 ,1],題目特別說不看順序所以你要回傳 [1, 0] 也可以。
2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
解法:
沒碰過演算法的人可能一開始都會想到用暴力解,也就是先用第 1 個去對剩下 N-1,再用第 2 個去對剩下 N-2 個,但這樣的做法會導致運算次數變成等差數列總和,也就是時間複雜度 O(N^2)。
我們可以花一點空間來換時間,也就是用另一個陣列來邊找邊記錄我們已找過的值,當發現 target - nums[i] 已經有找過時,就代表這是答案。
時間複雜度 O(N),如何證明檢 ...
用 Linux 的 systemd 來保持你的服務吧 !
簡介 :
systemd 基於一個事件驅動的機制,它可以同時啟動並管理多個服務,並在服務失敗或系統崩潰時自動重啟服務。它還提供了各種管理命令和工具,用於管理系統日誌、網絡配置、作業系統時間等等…。
首先,移動到系統單位檔案的存放位置 :
1cd /etc/systemd/system # 我是用 ubuntu 22.04 版本,如果你路徑不一樣請自己找
建立系統單位檔案 :
1touch <your service name>.service
打開你建立的檔案並寫入設定 :
12345678910111213[Unit]Description=<write your description>[Service]# 讓 systemd 知道編譯器和啟動檔案在哪,以及啟動方式,一般來說你怎麼啟動的就直接貼過來,不過他不吃你的 $PATH 所以要給完整路徑ExecStart=/usr/bin/python3 -u /home/ubuntu/projects/DiscordBot/main.py WorkingDirectory=/home/ubuntu/pro ...
用 Postman 實現 api 自動測試吧 !
Postman 工作區目錄架構 :
Postman 的工作區目錄架構為 Collection、Folder、Request、Example,如下圖 :
注意只有 Folder 可以自己包自己。
我們可以寫測試的範圍有 Collection、Folder、Request,不包含 Example,原因為 Example 只是把一些參數取出來單獨設定而已,他要執行時會將這些參數覆寫到繼承的 Request 並執行,但終究還是歸附於 Request,所以也會執行 Request 寫好的測試。
自動測試的執行順序 :
在 Collection、Folder、Request 界面中我們都可找到和設定「Pre-request Script」以及「Tests」,顧名思義就是一個是先跑的腳本、另一個是最後才跑的腳本,我們假設範例為 Collection 包 Folder 包 Request,且都有設定「Pre-request Script」以及「Tests」,那麼當你按下 Send Request 後的執行順序就是 :
Collection Pre-request Script
Folder ...
常用的第三方工具
工作中用過的一些第三方工具:
regex101 – 線上測試正規表達式工具
crontab guru – 線上測試 corntab 語法工具
sequencediagram – 畫時序圖工具
Draw.io – 畫圖工具
SQL Fiddle – 線上資料庫工具
dbdiagram – 資料庫工具
dbSchema – 資料庫工具
json editor – JSON 比對工具
JSON Schema – json 轉 jsonschema
Mr. Data Converter – CSV 轉其他格式
Slack – 團隊溝通
InVision – 前端畫面工具
figma – UI 設計工具
讓你的 git commit message 更容易閱讀
讓版控更加容易追蹤 :
習慣上會將每個 commit 的內容盡量限縮在單一單元或一件事上,以讓你的 commit message 和異動處能夠簡潔的對應,對於自己或團隊成員在追蹤進度、回顧異動上都能提高效率。
在這之上能更快表達此次 commit 意義的做法,就是在 commit message 開頭加上前綴字,常見的有 :
feat : 新增/修改功能 (feature)。
fix : 修補 bug (bug fix)。
docs : 文件 (documentation)。
style : 格式 (不影響程式碼運行的變動 white-space, formatting, missing semi colons, etc)。
refactor : 重構 (既不是新增功能,也不是修補 bug 的程式碼變動)。
perf : 改善效能 (A code change that improves performance)。
test : 增加測試 (when adding missing tests)。
chore : 建構程序或輔助工具的變動 (maintain)。
revert : 撤 ...
Codility Lesson MissingInteger
題目:
官網題目連結
根據題目敘述,會給一個由 N 個整數組成的陣列 A。需找出 A 中沒有出現且大於 0 的最小正整數。
例如輸入 A=[1, 3, 6, 4, 1, 2],答案應為 5。
A=[1, 2, 3],答案應為 4。
A=[-1, -3],答案應為 1。
N 是範圍 [1~100000] 的整數。
陣列 A 裡的元素都是範圍 [−1000000~1000000] 的整數。
解法:
第一時間還是想到了記憶法,先遍歷 A 記錄走過的不重複合法值,之後再遍歷記錄到的合法值來找出第一個 合法總數+1 的範圍內沒有記錄到的合法值。
總覺得還有機會想出跟 MaxCounters 一樣將當前最小值與合法最小值分開存的方法,就不用分兩次遍歷,但目前仍未想到。
時間複雜度 O(N)
空間複雜度 O(N)
PHP 程式碼:
我的解答
單元測試
Codility Lesson MaxCounters
題目:
官網題目連結
根據題目敘述,會給一個由 N 個整數組成的陣列 A 以及一個整數 M,你必須照順序遍歷 A 並執行以下判斷,之後返回結果陣列 R (包含 M 個整數) :
當遍歷到 A[K]=X,且 1 ≤ X ≤ N 時,結果陣列 R[K-1] 的值要加 1。
當遍歷到的 A[K]=N+1,則 R 中所有元素值都必須統一成當前 R 的最大元素值。
例如輸入 A=[3, 4, 4, 6, 1, 4, 4],M=5 :
當 K=0,A[K]=3,R[3-1] 要加 1,R 就變成 [0, 0, 1, 0, 0]
當 K=1,A[K]=4,R[4-1] 要加 1,R 就變成 [0, 0, 1, 1, 0]
當 K=2,A[K]=4,R[4-1] 要加 1,R 就變成 [0, 0, 1, 2, 0]
當 K=3,A[K]=6,R[6-1] 等於 M+1,R 所有元素要等於當前最大元素 2,所以 R 就變成 [2, 2, 2, 2, 2]
當 K=4,A[K]=1,R[1-1] 要加 1,R 就變成 [3, 2, 2, 2, 2]
當 K=5,A[K]=4,R[4-1] 要加 1 ...
Codility Lesson PermCheck
題目:
官網題目連結
根據題目敘述,會給一個包含 N 個元素的非空陣列 A。你必須檢查 A 中是否包含所有 1~N 的整數值且不重複(其實這有點廢話,因為當滿足包含所有 1~N 的整數時本來就不可能有重複)
例如輸入 A=[4, 1, 3, 2],滿足所有 1~4 且不重複,所以回傳 1。
而如果輸入 A=[4, 1, 3],不滿足所有 1~3 且不重複,所以回傳 0。
N 是範圍 [1~100000] 的整數。
陣列 A 裡的所有元素都是範圍 [1~1000000000] 的整數
解法:
這邊容易疏忽的點應該是並不保證餵進來的陣列其值都不重複,所以你不能用等差數列來解,依然需要紀錄走了哪些合法值,所以空間複雜度只能 O(N)。
再來由於一樣要追求遍歷一次就做完,所以我們需要找到規律,能先檢查的就是當發生重複(也就是當前遍歷值是已記錄過得合法值)時可以直接回傳 0,也就表示如果成功遍歷完一次 A ,就能確保 A 是元素不重複的陣列,也就能確保當我們紀錄的不重複合法值陣列總數等同於其內部的最大元素值時,就代表符合需求。
因為有點饒舌所以用範例說明,當輸入 A=[4, 1, 3, ...