Java系列文章

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

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

  • Michael
9 min read
Java系列文章

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

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

  • Michael
16 min read
攝影/影片/後製系列文章

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

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

  • Michael
2 min read
LeetCode系列文章

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

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

  • Michael
1 min read
攝影/影片/後製系列文章

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

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

  • Michael
3 min read
LeetCode系列文章

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

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

  • Michael
1 min read
LeetCode系列文章

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

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #118 Pascal's Triangle 解題

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #112 Path Sum 解題

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

  • Michael
1 min read
LeetCode系列文章

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

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #110 Balanced Binary Tree 解題

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

  • Michael
1 min read
LeetCode系列文章

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

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

  • Michael
2 min read
LeetCode系列文章

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

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

  • Michael
1 min read
LeetCode系列文章

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

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #101 Symmetric Tree 解題

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #100 Same Tree 解題

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #69 Sqrt(x) 解題

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

  • Michael
1 min read
LeetCode系列文章

[LeetCode] #66 Plus One 解題

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

  • Michael
1 min read