效能檢討

之前在 CodeWars 上解完 Kata 後都會 submit 看別人的答案,我覺得很多沒思考到的方法都是這樣學到的,然而無論是 Python 或 Java 都會看到很神奇的一行解法,沒有一行也能夠在我寫上數十行的題目下簡單兩三行搞定,真的非常佩服。

最近在 LeetCode 解 58. Length of Last Word,題目要求將一個字串(很長是句子甚至文章),找出最後一個單字的長度。我覺得這很容易呀?將 String 以空白字元 " " split 後,取字串陣列的最後一項,return 他的字長。

輕鬆完成 submit 後看到這樣的結果:

花費時間只贏過 52.84% 的投稿,花費記憶體贏過 30.25% 的投稿,雖然之前我沒有在注意這個評比,也知道這結果非常不理想。再想想看能不能改進,就想說從句子字串最後面往回找,碰到空白就停,稍微處理特殊的情形(最後就是連續空白字元),如此再重新 submit 一個沒有用到內建那些方便方法的版本

成果很明顯,花費時間贏過 100% 的投稿,花費記憶體贏過 82.20% 的投稿。


另外像 125. Valid Palindrome 這一題,要求判斷一個字串句子不考慮空白與符號,只看字母和數字,是否為迴文?這題最初我利用 String 的 replaceAll() 把非字母與數字的全取代成空字元 "",toLowerCase() 轉小寫,然後 for loop 從最初到中間,檢查是否前後一致,來判斷是否迴文。然後這是投稿結果:

時間贏過 29.25% 的投稿,記憶體贏過 20.14% 的投稿。真的是慘不忍睹。再三思考後我用 2 pointer 一個指前,一個指後,遇到非字母數字則跳過向中間靠攏,是字母或數字再來轉小寫字母比較,省去多數不必要動作,成果是:

時間贏過 98.23% 投稿,記憶體贏過 50.47% 投稿。

除了拼 Acceptance 還有效能可以挑戰的,又多了一個樂趣。

留言