文章

顯示從 4月, 2021 起發佈的文章

[LeetCode] 用 Spotify 舉例輕鬆理解 #3 Longest Substring Without Repeating Characters

圖片
LeetCode 第三題 acceptance rate 只有 30% 左右,是因為題目太難? 還是因為就算有解答大家還是看不懂? 其實解答的程式碼看了一下還滿好理解,但是如果對於剛學程式的我鐵定是看了很痛苦,一堆字串的位置處理,就算看到解答還是不會自己寫。 所以我今天來挑戰更難的: 如何讓其他人理解自己寫的 code,就像最近看的文章 Things You Should Never Do, Part I 裡面說的一樣: It’s harder to read code than to write it. 但其實不只這樣,有的時候光看 code 也是看不懂,這時候我們想要去讀 spec 就會發現根本沒有 spec。就算當初寫程式的人還在,跑去問他他可能會說: "這段 code 是我剛進公司寫的耶,我早就忘記我當初怎麼寫這段 code 了",所以我覺得可以把上面的話延伸一下: It's harder to find specs than to read code. 對於這麼生硬的 LeetCode 題目,我們有辦法做出易懂的 spec 讓人超好理解嗎?  用 Spotify 播放清單理解 LeetCode #3 我在 Spotify 上面隨機聽歌,聽到好聽的歌我就想加到我自己的清單: 每首歌我都用第一個單字來當代號好了。隔了一個禮拜我又聽到 On The Ground 覺得超好聽的 (假設而已,實際上我覺得還好),我想要加到我的清單,想要每次放就第一個聽到: 可是清單裡面已經有 On The Ground 了,每次聽到他我就知道下一首是 Peaches,再下一首我也知道是什麼歌,相信大家應該經常有這種經驗。所以我把有重複的後面的歌也一併刪除: 這樣至少我的清單裡面都是還算新的順序,怎麼聽都不會膩,也猜不到下一首歌是什麼。 OK,問題來了: 給你一堆好聽的歌要加,照上面這樣做的話,你能 找出最長的清單多長 嗎? 例如有人常常長途旅行在車上放歌,當然希望清單越長越好,又不想要聽到聽過的順序。這就是 LeetCode #3 在解的問題。 用 PowerPoint 做 Spec 我還記得學軟體工程的課的時候常常要練習寫 spec,就會像網路上隨便找 design spec template 就會找到像這種的: ( ref ) 但這其實還是太抽象...

[技巧] 用 VSCode Terminal 連到遠端 Linux 但是有些組合鍵按不了?

圖片
如果你想用 VSCode Terminal 取代傳統用 PuTTY, MobaXterm 等 SSH 工具,第一個會遇到的障礙就是像是 Ctrl + K , Ctrl + E , Ctrl + V 有些組合鍵都沒辦法用。 "不能用"的原因可能有幾個: VSCode 傳送的 ASCII code 和 PuTTY 傳送的 ASCII code 不一樣 VSCode 的組合鍵被 VSCode 上面的東西給搶先攔截了 (像是 Ctrl + E 會開啟 Go to file... 功能) 再來也有可能不是 VSCode 的問題,是 stty 或 SSH 端的程式沒設置好 按鍵傳送的 ASCII Code 和想像的不一樣 像是我們開 PuTTY 的設定 Terminal -> Keyboard 就會發現裡面有設置像是 Backspace 按下去應該會送出什麼 ASCII code: 預設是送出 127 ( ^?, 0x7f ),但是有可能會出於各種因素設置到 Control-H (也就是 Ctrl + H, ^H, 8, 0x8 )。但 VSCode 預設設定是右邊的。所以如果你習慣的設定剛好就和 VSCode 預設不一樣的話就會發現 VSCode terminal 中 backspace 按下去怎麼不是刪除文字而是會冒出一些怪怪的符號、或是一些不該有的行為。 按鍵被 VSCode 搶先攔截 就算你在 VSCode terminal 按 Ctrl + E,VSCode Go to file... 的功能就會搶先跳出來,terminal 根本沒有機會知道你按了什麼: 其他還有很多按鍵通通會觸發 VSCode 的功能。 別讓 VSCode 攔截按鍵 你可以在 settings.json  裡面用 " terminal.integrated.commandsToSkipShell " 來關閉哪些 VSCode commands 不要使用,記得在前面加上一個 "-" 字元,它自然就會把按鍵乖乖傳給 shell: { "terminal.integrated.commandsToSkipShell": [ "-editor.action.toggleTabFocus...

[C++] 在 Windows 用 WSL + Callgrind 加速 LeetCode C++ 程式碼

圖片
最近無聊開始玩玩看 LeetCode ,想說用一些奇怪的方法來解經典的第一題 Two Sum 。果然用奇怪的方法就會產生很爛的結果: 時間不僅慢,也花得比別人多記憶體。排行爛到炸。其實原因就是因為我想要用 array 來當 hash 看能不能讓他更快一點,不過 array 的 size 太大他要 initialize 也是很花時間的: static const int BUCKET_SIZE = 10; class Solution { public: std::vector<int> twoSum(std::vector<int> &nums, int target) { char bits[(250000000 + 1) / BUCKET_SIZE + 1] = {0}; for (size_t i = 0; i < nums.size(); i++) { const int num = nums[i]; const int nonnegNum = (num + 1000000000) / BUCKET_SIZE; // Check if the number exists const int bucketIndex = nonnegNum / 8; const int offset = nonnegNum % 8; if (bits[bucketIndex] & (1 << offset)) { // Only knows the bit is set, but we don't know the index // So we need to find where the other number is const int other = target - num; for (size_t otherIndex = 0; otherIndex < nums.size(); otherIndex++) { if (nums[otherIndex] == other && i != otherIn...

[插件] 在 Chrome 網頁做區分大小寫的搜尋

圖片
寫軟體的時候最常用到的功能就是上網查 API 文件,但是常常會遇到一個困擾就是,搜尋的文字在 Chrome 裡面是不區分大小寫 (case-insensitive) 的。有的時候是還好,多按一些 F3 就找到了,可是有時候實在是太多大小寫的東西混在一起,這時候我們有一些快速的解法: 用 Firefox 搜尋 (Firefox 的搜尋框裡面預設就提供有 match case 的功能了) 開 DevTools 按 Ctrl + Shift + F 進行全部東西的搜尋 (不過大概會發瘋) 用插件的解法算是意外發現的,原本只是在找有沒有可以用 regex 搜尋的插件,沒想到意外發現  regex 的插件也是可以拿來做區分大小寫 (case-sensitive) 的一般搜尋。 用 Chrome Regex Search 來做區分大小寫的搜尋 先裝好 Chrome Regex Search 之後,按 Ctrl + Shift + F 或是點工具列的圖示,打上想找的文字就可以了。 例如我最近在看 Qt QTextCursor 的文件,但是我只想找 "cursor",很不幸的如果用 Chrome 預設搜尋他會把一大堆 QText Cursor 也會找到: 如果用 Chrome Regex Search 就會侷限在小寫的 "cursor": 用 Regex 的陷阱 如果你不知道 regex 是什麼,那你很有可能會發現在搜尋一些含特殊符號的東西會搜尋到怪怪的東西,不然就是搜尋會失敗。 這是因為 regex 本來就是偏工程師在用的東西,有一些符號是有特殊涵意的,所以如果搜尋的字包含以下任何特殊符號記得要在前面加一個反斜線 \ ( ref ): . + * ? ^ $ ( ) [ ] { } | \ 例如我想搜尋 1+1=(2-1)+1*1 ,那其實要打 1\+1=\(2-1\)\+1\*1  才會正確找的到。 是不是很麻煩? 不過如果你要找的東西有特殊符號的話,其實用一般 Chrome 的搜尋通常是不會有太多搜尋結果的,那就用一般搜尋就好。 Chrome 什麼時候要支援大小寫搜尋? 其實上面弄了那麼麻煩,還不如開個 Firefox 搜尋更快。那我就滿好奇,這麼基本的功能怎麼 Chrome 一直都沒做? 找了一下才發現 Super User 有人...

[插件] 把網銀表格資料匯出到 Excel

圖片
如果你也是跟我一樣是預算控,很喜歡掌控自己的花費,除了要每一筆花費都立刻先記錄養成習慣以外,最麻煩的還是對帳單的問題了 雖然我知道像是 麻布記帳 可以自動同步帳號,可是有時候還是要手動下載對帳單自己一條一條對才會安心許多,也可以避免沒發現一些漏記的項目或小額盜領。 所以問題回到要怎麼把網頁的東西匯出成像是 Excel 的格式,其實滿多插件都有提供這個功能,我們只要去搜尋 html table to excel 就能找到類似的插件,這邊就介紹兩個就好了。 網銀的障礙 把 Table 匯出成 Excel 看似很簡單,遇到網銀就不簡單,因為有些網銀會限制一些事: 有些會把工具列藏起來,讓你不能點插件的按鈕 有些會禁止你點右鍵,讓一些插件右鍵選單也不能用 最慘的就是以上兩個都有,雖然我個人目前用過的網銀都只會碰到其中之一,不過底下的插件他們都有提供快捷鍵,所以就算上面兩個都被禁止你還是有辦法可以 copy 表格。 Table Capture Table Capture 擴充功能 Chrome 商店 Table Capture 感覺華麗許多,雖然有些功能要升級成 Pro 才能用,但是我們只要 copy table 到 Excel 的話其實就夠用了。 我們就用玉山銀行的網銀上面的信用卡帳單來舉例子好了,因為這個跳出來的視窗沒有工具列,假設他也禁止你點右鍵好了,那你其實可以用 Table Capture 的快捷鍵 Alt + Shift + D 把他叫出來: 然後找到你想要複製的表格點 Copy to Clipboard,再開一個 Excel,對著左上角第一格按 Ctrl + V 就完成了: 如果要繼續轉成其他格式像是 csv,從 Excel 繼續操作也比較好上手。 Copytables Copytables 擴充功能 Chrome 商店 Copytables 是我一開始比較喜歡用的插件,因為他滿單純的,也不用像另外一個插件要升級成 Pro 版才能多一些功能。 我們就繼續用玉山銀行的信用卡帳單來舉例子,到任何網銀你可以點右鍵,選 Table... -> Copy: 再開一個 Excel 直接 Ctrl + V 複製貼上就完成了 如果你不喜歡他貼上網頁的格式的話,他其實也有其他複製貼上的格式,如果你去他插件選項把預設改成 Plain Table 他就會貼上表格而不會把格式帶進...

[插件] YNAB 進階技巧: Toolkit for YNAB 更好看的圖表

圖片
會知道 Toolkit for YNAB 這個插件是因為某一天逛 Reddit 發現怎麼有人網頁版 YNAB 右上角有 Days of Buffering 這個東西,看回復才知道說這是裝了 Toolkit for YNAB 什麼是 Age of Money? Age of Money 錢錢的年紀大家其實一直搞不清楚,大部分人的回答都是 "就是錢直到被花掉前,大概會待在你的錢包多久",但詳細的計算方式可能很複雜,所以我之前也不想搞懂,就只是覺得這數字應該要越大越好,超越 30 天就好棒棒。 不過既然提到他,那就要把它搞懂來,YNAB 官網有個 文章 是這樣說明的: You'll see a metric for Age of Money right in the YNAB app. This number is the average age of your last ten  outflow  cash  transactions (cash, as always in YNAB, meaning non-credit, not literal cash-and-coins) 所以其實他的計算方式其實滿清楚的: 他只拿最後 10 筆花費的 transactions 支出 (紅色的、有 - 號的) 來做計算 他只看現金流,就是 non-credit 不看信用卡那類的東西 但文章底下還有用 bucket 來講解的,看完才知道他還有用一個東西來計算: 每一筆 transaction 他都會去找這筆錢從哪裡來的 舉個範例最快: Day 0: 拿到發票獎金 $200 Day 15: 花掉了 $100 Day 30: 再花掉了 $100 我們花掉第一次 $100 元是靠 Day 0 的錢,所以距離 15 天,他就先記下 15 這個數字。 我們之後再花掉 $100 也還是靠 Day 0 被扣掉 Day 15 花的錢還剩 $100 可以用,但是這時候距離 30 天,他就再記下 30 這個數字。 所以說,最後的 Age of Money 就應該是取平均 (15+30)/2 = 22.5 天囉。如果 Day 0 的錢被花完他就會去找下一個可以繼續扣的錢,那就是他所謂的 bucket 就想像成有很多桶子裡面是錢等著被花。 不過就算你看到 Age of Mon...

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

[Side Project] 互動式教學神經網路反向傳播 Interactive Computational Graph

[插件] 在 Chrome 網頁做區分大小寫的搜尋