Latest

[LeetCode] #12 Integer to Roman 解題

題目連結 題型解說 這是一題難度為普通的題目 需要設計一個方法,此方法會傳入一個整數 num 要求是把整數轉換成羅馬字母,轉換清單如下 I => 1 V => 5 X => 10 L => 50 C => 100 D => 500 M => 1000 但羅馬字母有一些特殊規則 4 並非 IIII 而是 IV,9 並非 VIIII 而是 IX 這規則同樣可以套用到 40 90 400 900 解題思路 既然知道特殊規則是一樣的,變得是使用的符號,那麼先從 num 取個位數開始 轉換完成後,把 num 除上 10,消除個位數,

By Michael

[LeetCode] #11 Container With Most Water 解題

題目連結 題型解說 這是一題難度為中等的題目 需要設計一個方法,此方法會傳入一個數字陣列 height 陣列中的元素代表每一個柱子的高度 現在需要計算出,該陣列中以某兩隻柱子為邊界,最多可以裝多少水 以範例來說 height = [1,8,6,2,5,4,8,3,7] 最多可以裝 7 * 7 = 49 單位的水 解題思路 計算面積就是底乘上高 底的計算方式為 「右邊柱子的 index」 減去 「左邊柱子的 index」 高就取最短的那一根柱子高度 拿題目給的例子來當範例 建立三個變數 result、left、right left、right 代表左右兩邊的 index result 代表目前最大容量,初始值 0 第一步,找出最短的柱子高度,

By Michael

[LeetCode] #941 Valid Mountain Array 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個數字陣列 arr 判斷陣列中的元素是不是由低到高再從高到低(山形)的排序,且不連續一個以上數字 比如說 [1,2,3,2] 就是一個山形陣列,但 [1,2,2,3,2] 不是,因為有兩個 2 [1,2,3,4,5] 和 [5,4,3,2,1] 也不算是山形陣列,前者只有往上沒有往下,後者相反 解題思路 準備一個數字變數(temp)和布林變數(asc),跑一次迴圈,有可能遇到如下狀況 1. 某個數字與前一個數字相同,這時候直接回傳 false

By Michael

[LeetCode] #944 Delete Columns to Make Sorted 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個字串陣列 strs 這個陣列中每個字串的長度都相同,字串內容都是小寫英文 需要檢查每個元素的第 N 個字元是不是由小至大排列,並回傳有幾個錯誤排列 比如傳入的陣列長這樣 ["cba","daf","ghi"] 取第一個字元 = cdg 取第二個字元 = bah 取第三個字元 = afi 其中第二組的結果(bah)並不是由小至大排列,故回傳 1 解題思路 這一題就用兩個迴圈各別把字元取出來,並比較是否比上一個字元大(Java 中的字元可以直接比較),如果不是就將結果+1 程式碼 Java class Solution { public int minDeletionSize(String[] strs) { int result = 0; for (int i = 0,

By Michael

[Java]手把手帶你實作PTT爬蟲(2)-文章內容及儲存

前言 上一篇教學實作了一個簡單的爬蟲並成功的爬到了 PTT 的文章列表 這次就繼續將 PTT 文章內容給爬回來然後儲存到電腦上 必備知識 1. 上一篇所列的知識 2. 多型 3. 介面 4. 執行緒 5. 檔案處理 獲取文章內容 這邊就直接放出程式碼了,大多都是上一篇說明過的部分 在 ptt.crawler.Reader 中加入以下 Method public String getBody(Article article) throws IOException { /* 如果看板需要成年檢查 */ if (article.getParent().getAdultCheck()) { runAdultCheck(article.getUrl()); } /* 抓取目標頁面 */ Request request = new Request.Builder() .url(Config.

By Michael

[Java]手把手帶你實作PTT爬蟲(1)-文章列表

前言 好幾年前寫過一篇 Java 的爬蟲文章,好像是我部落格內最受歡迎的一篇... 時過境遷,Eclipse 退流行了、Java 出到 15 了,加上一些因素 打算把爬蟲文章重新寫過一遍,這次會當是做一個 Site project,盡量把內容充實一點 預計這系列文章應該會寫個五六篇以上,後面也會教到資料庫及圖形化介面 必備知識 1. 常用 Http request   Ex. get post 2. Cookie 相關知識 3. HTML相關知識 4. CSS 選擇器相關知識 5. Java OOP 相關知識 使用環境 1. Intelli J 2. Chrome 創建專案 這次我們使用的 IDE 是

By Michael

[後製]小技巧-三個初學者配音時需注意的項目

配音 這篇主要是分享一下配音時需要注意的項目 這邊的配音指的是後製影片時才加入的聲音,而不是錄影時的錄音 需要用到配音的情況可能有以下幾種 1. 拍片現場太吵雜,收音效果不佳 2. 需要旁白 3. 需要多語言 先寫好稿子 配音時能一邊看稿一邊配是比較好的選擇 一來可以不用記太多字,二來配音會很通順,三來重配時不會忘記上一次講了甚麼,四來拍片時可以預留時間長度 拍/剪片時預留好配音的時間長度 我自己第一次配音時遇到最大失誤點就是剪完片要配音時 遇到很多次原本的台詞沒辦法在預定的畫面中說完 但是影片已經剪好了,總不可能全部重來,所以只好改台詞 這邊建議是在拍/剪片時能夠預先抓好要配音的長度 配音時錄一句確認一句 在不熟悉眾多修音軟體的情況下 最好的方式就是把一句錄好後再錄下一句 雖然說這種方式要重複的 撥放 -> 聆聽 -> 重配 的循環 但這是最能確保整部影片配音的品質是落差不大的 比如聲音忽大忽小、卡頓、雜音、環境音...等等 後記 這篇是我配音後得到的一點小小心得,因為我是一人團隊 拍片

By Michael

[LeetCode] #122 Best Time to Buy and Sell Stock II 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數陣列 prices 這個陣列表示每一天的股票價格,若可以購買無數次(買入 + 賣出) 回傳最大利潤是多少 解題思路 這一題是 [LeetCode] #121 Best Time to Buy and Sell Stock 解題 的延伸 上一題是要求只能買一次,這一題是可以買無數次 但規則一樣是手頭有買入的股票前不能再買入 一開始解法是把所有的狀況走一遍,找出利潤最好的那個 後來看了官方提供的思路,其實只要用迴圈歷遍一次,只要比明天的價格低就把差價算到利潤去 因為最大的利潤可以拆成多個小利潤的和 程式碼 Java class Solution { public int maxProfit(int[] prices) { int resule = 0; for (int i = 0; i

By Michael

[後製]小技巧-如何下載 Google 小姐語音

教學 如何簡單下載 Google 小姐的語音? 最簡單的方法就是在下面的網址最後加入想要的文字 https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=zh-TW&q= 比如想要讓 Google 小姐說出「你好」,只需要在網址最後加上你好,像這樣 https://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&tl=zh-TW&q=你好 之後就可以下載語音了 大量下載 如果想要大量下載的話,我推薦我自己製作的 Miss Google 後記 在沒有預算買麥克風或是想要做點效果的時候,Google 小姐語音是一種不錯的替代方案 有空可以嘗試看看唷

By Michael

[後製]使用 Photoshop 對文字加外框

前言 製作影片縮圖時都會用一些文字來敘述,但是只使用文字又覺得有些單調 那麼就來幫個文字加個外框吧。 如果沒有 Photoshop 的話,也可以使用一些線上的類 Photoshop 今天就用一個類 Photoshop 的網站 https://www.photopea.com/ 來當範例 最後有附上操作影片,可以搭配著圖文一起觀看 教學 開啟網站後看到初始畫面,點下 New Project 調整一下你要的參數,按下 Create 進入編輯畫面後,利用左邊的文字工具在畫布上寫上想要的文字 再來按住 Ctrl 後對著文字旁邊的小框框用滑鼠左鍵點一下,之後應該可以看到文字週遭出現虛線 之後選擇上方的 Select -> Modify -> Expand 輸入想要的外框大小,這邊用 10px 當範例 點下 ok 之後可以看到原本的虛線往外擴張了 再來點選右下角的 new layer 來增加一個新圖層

By Michael

[LeetCode] #121 Best Time to Buy and Sell Stock 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數陣列 prices 這個陣列表示每一天的股票價格,若只能購買一次(買入 + 賣出) 回傳最大利潤是多少 解題思路 原本我是利用兩個索引左右移動想辦法找出最大利潤是哪一個 但總會有一些例外狀況導致算法不通過 這題想了很久也沒想出怎麼寫才是有效率的 後來就放棄去找答案,原來只要紀錄下當下最小值與最大利潤 下次遇到更小的值就更新一下,繼續計算最大利潤就好 程式碼 Java class Solution { public int maxProfit(int[] prices) { int result = 0; int min = Integer.MAX_VALUE; for (int i = 0, len = prices.length; i < len; i++) { min = Math.min(min,

By Michael

[LeetCode] #119 Pascal's Triangle II 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 rowIndex 回傳一個巴斯卡三角形中的 rowIndex 層 解題思路 這題是 [LeetCode] #118 Pascal's Triangle 解題 的延伸 原本是要回傳整個巴斯卡三角形,現在只要回傳某一層 且空間複雜度只能是 O(k),也就是只能用一個 List 那麼就把每一層的值算出來,然後把下一層的值覆蓋上去 程式碼 Java class Solution { public List getRow(int rowIndex) { List result = new ArrayList<>(); for (int i = 0; i <= rowIndex; i++) { result.add(

By Michael

[LeetCode] #118 Pascal's Triangle 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 numRows 回傳一個與 numRows 相同層數的巴斯卡三角形 解題思路 這一題看一下官方給的示意圖就大概知道怎麼寫了 除了第一個及最後一個元素都是 1 之外 每一個元素(j)的值都是上一層(i - 1)(j) + (i - 1)(j - 1) 程式碼 Java class Solution { public List> generate(int numRows) { List> result = new ArrayList<>(); if (numRows == 0) { return result; } result.

By Michael

[LeetCode] #112 Path Sum 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 和一個整數 sum 回傳這棵樹有沒有一條路徑的所有節點總和為 sum 必須得要走到最後一個節點 解題思路 這題看是要寫個遞迴還是使用 Queue 搭配迴圈都可以 如果選擇遞迴版本的,可以用同一個方法來遞迴 每一層把 sum 減去節點的值後傳到下一層去 若遇到最後一個節點並且 sum 剛好為 0 就回傳 true 如果選擇迴圈版本,可以把上一層節點的值加到下一個節點中 若遇到最後一個節點並且值與 sum 一樣就回傳 true 程式碼 Java class Solution { public boolean hasPathSum(TreeNode root, int sum) { if (root == null) { return false; } int n

By Michael

[LeetCode] #111 Minimum Depth of Binary Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹最淺節點深度 解題思路 這題看是要寫個遞迴還是使用 Queue 搭配迴圈都可以 記得不要用到 Stack 了,Queue 是先進先出 修改一下 [LeetCode] #110 Balanced Binary Tree 解題 的解法就可以了 程式碼 Java class Solution { public int minDepth(TreeNode root) { if (root == null) { return 0; } if (root.left == null) { return minDepth(root.right) +1; } else if (root.

By Michael

LeetCode系列文章

[LeetCode] #110 Balanced Binary Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹是不是高度平衡,也就是左節點的深度與右節點點的深度相差不超過 1 解題思路 這題看是要寫個遞迴還是使用 Stack 搭配迴圈都可以 一開始做這一題時搞錯題意,原本以為只要從根節點算左右深度相減不超過 1 就好 結果是每一個節點左右都要平衡 Orz 程式碼 Java class Solution { public boolean isBalanced(TreeNode root) { if (root == null) { return true; } if (Math.abs(isBalanced(root.left, 1) - isBalanced(root.right, 1)) > 1) { return false; } return isBalance

By Michael

LeetCode系列文章

[LeetCode] #108 Convert Sorted Array to Binary Search Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個排序好的陣列 nums 回傳一顆平衡的二元搜尋樹,左右兩邊的層級不能超過 1 解題思路 二元搜尋樹有幾個特性 1. 不會有重複的值 2. 左節點數值一定比根節點數值小 3. 右節點數值一定比根節點數值大 4. 其他層的節點也要符合以上要求 既然所有的右邊節點一定比根節點大,所有左邊節點一定比根節點小,題目也規定兩邊的層數不能相差超過 1 那麼根節點只能選 nums 的中間值,這邊有個小疑問「如果 nums 是偶數呢?」,是要選左邊那個還是右邊那個? 答案其實無所謂,因為題目有提示說答案不止一種 根節點選擇好了後就能把 nums 拆成左右兩部分,左右兩部分也需要符合 二元搜尋樹 的特性 那一樣選擇中間值拆左右兩部分,所以分析後最適合的解法就是二分搜尋法了 程式碼 Java class Solution { public TreeNode sortedArrayToBST(int[] nums)

By Michael

LeetCode系列文章

[LeetCode] #139 Word Break 解題

題目連結 題型解說 這是一題難度為中等的題目 需要設計一個方法,此方法會傳入一個字串 s 和 字串 list wordDict 回傳能不能利用 wordDict 內的值組合出 s 範例: s = "applepenapple", wordDict = ["apple", "pen"],則回傳 true s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"],則回傳 false 解題思路 - 遞迴暴力法 這種方法簡單來說就是從頭開始切字串,如果切到存在於 wordDict 的字串時 就把剩餘字串進行下一次遞迴,直到所有狀態都走過一次或找到解答為止 執行結果: Time Limit Exceeded 程式碼 Java class Solution { public

By Michael

LeetCode系列文章

[LeetCode] #107 Binary Tree Level Order Traversal II 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 將這顆樹每一層的節點收集後回傳 解題思路 這題也是沒什麼難點,看是要用遞迴還是迴圈都可以解題 LeetCode 上有很多的題目都跟樹有關的,基本歷遍樹的方法掌握之後,解題上都不會太困難 程式碼 Java class Solution { public List> levelOrderBottom(TreeNode root) { List> result = new ArrayList<>(); levelOrderBottom(root, 1, result); Collections.reverse(result); return result; } public void levelOrderBottom(TreeNode root, int nowLevel, List

By Michael

LeetCode系列文章

[LeetCode] #104 Maximum Depth of Binary Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹最深的節點是第幾層 解題思路 這題基本上就是用遞迴去濾到最後深的一個節點,雖然說使用迴圈也可以做到 但就必須多寫一點程式碼,底下也會提供迴圈的版本 講回到遞迴,都必須搭配一個數字來計算第幾層 有從第一層加下去的,也有從最後一層加上來的 兩種版本也會附上 程式碼 Java class Solution { // 從第一層加下去 public int maxDepth(TreeNode root) { return maxDepth(root, 1); } private int maxDepth(TreeNode root, int nowLevel) { if (root == null) { return nowLevel -1; } return Math.max(maxDept

By Michael

LeetCode系列文章

[LeetCode] #101 Symmetric Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個二元樹 root 回傳這棵樹是不是左右對稱的 解題思路 這題跟上一題 [LeetCode] #100 Same Tree 解題 是高度相像的 唯一的差異是因為要確認是否對稱,所以是左邊跟右邊比,右邊跟左邊比,中間一樣跟中間比 其中一個沒比對上就回傳 false 程式碼 Java class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) { return true; } return isSymmetric(root.left, root.right); } public boolean isSymmetric(TreeNode p, TreeNode q) { if (p

By Michael

LeetCode系列文章

[LeetCode] #100 Same Tree 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入兩個二元樹 p 和 q 回傳這兩棵樹是不是完全一樣 解題思路 這題看是要寫個遞迴還是使用 Stack 搭配迴圈都可以 沒有什麼困難點,就是左邊跟左邊比,右邊跟右邊比,中間跟中間比 其中一個沒比對上就回傳 false 程式碼 Java class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } else if (p == null || q == null || p.val != q.val) { return false; } return

By Michael

LeetCode系列文章

[LeetCode] #88 Merge Sorted Array 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入兩個已排序的整數陣列 nums1 nums2 及它們各自的長度 m 與 n 將 nums2 的元素合併到 nums1 後進行排序即可 另 nums1 有保留給 nums2 的欄位,所以不需要另外產生新的陣列 範例: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3,則回傳 [1,2,2,3,5,6] m 為 nums1 的元素數量,n

By Michael

LeetCode系列文章

[LeetCode] #83 Remove Duplicates from Sorted List 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個已經排序好的 Linked List head,當中每一個元素都有一個數字 將這個所有的重複數字移除後回傳 範例: head = 1->1->2,則回傳 1->2 head = 1->1->2->3->3,則回傳 1->2->3 解題思路 這一題沒有太多好講的部分,就是利用迴圈或是遞迴的方式來把重複的數字過濾掉 如果是利用迴圈的方式,得要建立兩個參考物件 一個用來參考到最後一個元素,另一個用來歷遍所有元素 另一個遞迴解法是其他人提交的內容,寫遞迴挺燒腦的,所以就直接拿其他人的來用 很巧妙,只有三行 程式碼 Java class Solution { public ListNode deleteDuplicates(ListNode head) { if

By Michael

LeetCode系列文章

[LeetCode] #70 Climbing Stairs 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 n,這個 n 代表的階梯的數量 如果一次只能走 1 個階梯或 2 個階梯,回傳要到達第 n 個階梯有幾種走法 範例: n = 1,則回傳 1,因為只有一個階梯,也只能選擇走 1 個階梯 n = 2,則回傳 2,因為可以選擇走兩次 1 個階梯或是一次走 2 個階梯 n = 3,則回傳 3,因為可以選擇 1. 走三次 1 個階梯 2. 第一次走 1 個階梯,第二次走 2

By Michael

LeetCode系列文章

[LeetCode]#35 Search Insert Position 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個排序好的整數陣列 nums 和一個目標數字 target 找出 target 在 nums 的索引返回,如果沒有找到,則返回插入的索引 範例: nums = [1,3,5,6], target = 5,則回傳 2 nums = [1,3,5,6], target = 2,則回傳 1,因為 2 不存在 nums 中,又因 2 小於 3,所以插入時會在 3 的位置,所以回傳 3 的索引 1

By Michael

LeetCode系列文章

[LeetCode] #69 Sqrt(x) 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 x 計算出最接近 x 平方根的整數答案後回傳 簡單說就是去掉小數點只回傳整數部分 範例: x = 8,則回傳 2,雖然 8 的平方根介於 2 和 3 之間,但題目只要我們取整數就好 解題思路 如果你有搜尋過這個題目的話,大概知道主要的解題方向就是二分搜尋法的變種 更厲害的就會用 牛頓迭代法 來求根,但那已經是數學領域的東西,我自己是怎麼都看不懂 後來就自己簡單的寫了一個類似 十分逼近法 的解法,一樣可以過關 一開始用一個比較大的區間計算,我是設定 100 利用迴圈每次加 100 後計算平方直到大於 x 再慢慢扣 1 直到小於等於 x 程式碼 Java class Solution

By Michael

LeetCode系列文章

[LeetCode] #67 Add Binary 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入兩個字串 a 和 b,字串內容是二進制(只有 0 和 1) 將兩個字串的二進制內容相加後回傳 範例: a = "11", b = "1",則回傳 "100",因為 11 + 1 = 100 a = "1010", b = "1011",則回傳 "10101" 解題思路 跟之前的一些題目一樣,有字串解跟數字解兩種方式 字串解比較直覺,但效能較差一些,程式碼也會多一些 兩種解同樣都是從字串最後面往回歷遍,等同於加法方式,由右到左 程式碼 Java class Solution { public String addBinary(String a, String

By Michael

LeetCode系列文章

[LeetCode] #66 Plus One 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數陣列 digits 將這個陣列看作一串數字的組合,把數字 + 1 後回傳 範例: digits = [1,2,3],則回傳 [1,2,4],因為 123 + 1 = 124 解題思路 一開始走了彎路,寫了很多判斷和使用 List 來應付位數增加的情況 後來研究其他人的寫法後才恍然大悟,因為忽略了一個很簡單的事實 位數增加的情況就只會是 9、99、999、9999...等等 加上 1 後變成 10 100 1000 10000,也就只有這個情況位數才會增加 只要其中一位數不是 9 ,就可以直接回傳了 程式碼 Java class

By Michael

LeetCode系列文章

[LeetCode] #58 Length of Last Word 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個字串 s 字串中由一些空白字元當作間隔,請找出最後一個單詞後將長度回傳 s 中只會由空白及英文字母組成,如果不存在最後一個單詞就回傳 0 範例: s = "Hello World",則回傳 5 解題思路 這題需要從字串的尾部開始,宣告一個計數器後逐字元確認 如果遇到空白字元請計數器不為 0 ,則直接回傳 程式碼 Java class Solution { public int lengthOfLastWord(String s) { int result = 0; for (int i = s.length() -1; i > -1; i--) { if (s.charAt(i) == '

By Michael

LeetCode系列文章

[LeetCode] #38 Count and Say 解題

題目連結 題型解說 這是一題難度為簡單的題目 需要設計一個方法,此方法會傳入一個整數 n,將 n 計數轉換後回傳 一開始看到這一題無法第一時間理解意思 後來找了下中文翻譯後總算了解題目是想要說什麼 範例: n = 1,直接回傳 1 n = 2,需要回傳 11,因為 n = 1 時是回傳 1,所以用語言說的話就是 1 個 1 => 11 n = 3,需要回傳 21,因為 n = 2 的時候是 2 個 1 n = 4,需要回傳 1211,因為 n = 3 的時候是 1

By Michael