[TDD]LeetCode 58. Length Of Last Word

LeetCode 58: Length of Last Word

題目說明:給一個字串,裡面可能包含英文字母(alphabets) 與空格(space)。回傳最後一個單字(word)的長度。

例如: "Hello World    ", 應回傳 5, 因為 World 的長度為 5。

Step 1, 新增測試案例。長度為2,  不含空格的 word。 s 為 "bc"

【測試代碼】

【尚未實作的生產代碼】

Step 2, hard-code return s.Length, 通過測試

【生產代碼】先 hard-code return s.Length, 後面的代碼總用得到 s.Length 的。

【重構測試】將驗證方法擷取出來

Step 3, 新增測試案例,結尾帶多個空格。s 為 "bc   "

【測試代碼】

【生產代碼】先 TrimEnd() 再取 Length

Step 4, 新增測試案例,s 由兩個 word 組成,中間含空格。 s 為 "bc xyz"

【測試代碼】

【生產代碼】:從後面找回來,找到第一個空格,就知道最後一個 word 的長度。

Step 5, 新增測試案例, s 最前面從空格開始。 s 為 "  a"

【測試代碼】

【生產代碼】調整 for loop 邊界

【重構】如果 TrimEnd() 得先巡覽一次 s 而浪費無謂的效能,試著在同一個 for loop 中處理掉結尾的空白。透過 isEndSpaceClear 判斷是否已經走完 s 結尾的空白。

【重構】rename & extract method

最終生產代碼
    public class Solution
    {
        public int LengthOfLastWord(string s)
        {
            var isEndSpaceClear = false;
            var endCharIndex = s.Length - 1;
            for (int i = s.Length - 1; i >= 0; i--)
            {
                if (!isEndSpaceClear && !IsSpace(s[i]))
                {
                    isEndSpaceClear = true;
                    endCharIndex = i;
                }
                else if (isEndSpaceClear && IsSpace(s[i]))
                {
                    return endCharIndex - i;
                }
            }

            return isEndSpaceClear ? endCharIndex + 1 : 0;
        }

        private static bool IsSpace(char @char)
        {
            return @char == ' ';
        }
    }
通過 LeetCode 上所有測試案例

結論

我還是比較喜歡 TrimEnd() 完找第一個空格的寫法,好讀很多。TrimEnd() 耗的效能,就賴給 .NET Framework 吧,哈!

GitHub commit history: LeetCode58_LengthOfLastWord 

或許您會對下列培訓課程感興趣:

  1. 2019/3/15(五)~2019/3/17(日):C#進階設計 201903 第一梯次(台北)
  2. 2019/5/4(六)~2019/5/5(日):Clean Coder: DI 與 AOP 進階實戰 201905 第一梯次(台北)
  3. 2019/5/18(六):【單元測試實戰營】第六梯次(台北)
  4. 2019/5/19(日):【極速開發】第七梯次(台北)
  5. 2019/6/15(六)~2019/6/16(日):工程實踐與流程規範導入實務 201906 第一梯次(台北)
  6. 2019/7/27(六)~2019/7/28(日):演化式設計:測試驅動開發與持續重構 第六梯次(台北)

想收到第一手公開培訓課程資訊,或想詢問企業內訓、顧問、教練、諮詢服務的,請洽 Facebook 粉絲專頁:91敏捷開發之路

如您覺得這篇文章對你有幫助,想請我喝杯咖啡,可以用街口小額贊助一下 (NT$ 30)。