[TDD]LeetCode 58. Length Of Last Word

LeetCode 58: Length of Last Word

題目描述

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

例如: "Hello World ", 應(yīng)回傳 5, 因為 World 的長度為 5。


TDD 開始

Step 1, 新增測試用例。長度為2, 不含空格的 word。 s 為 "bc"
【測試代碼】

測試代碼

【尚未實作的生產(chǎn)代碼】

    public class Solution
    {
        public int LengthOfLastWord(string s)
        {
            throw new NotImplementedException();
        }
    }

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

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

hard-code return s 長度

【重構(gòu)測試】將驗證方法擷取出來

重構(gòu)測試:封裝驗證行為

Step 3, 新增測試用例,結(jié)尾帶多個空格。s 為 "bc "

【測試代碼】

測試用例:s 結(jié)尾帶空格

【生產(chǎn)代碼】先 TrimEnd() 再取 Length。

生產(chǎn)代碼迭代差異

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

【測試代碼】

測試用例: s 由 2 個 word 組成,中間含空格

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

先去結(jié)尾空格後,由後往回找到第一個空格,即為 Last word 長度

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

【測試代碼】

測試用例:開頭帶空格

【生產(chǎn)代碼】調(diào)整 for loop 邊界

修正 for loop bug

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

重構(gòu)巡覽方式

【重構(gòu)】rename & extract method

重構(gòu):rename 與 extract method 增加易讀性

最終生產(chǎn)代碼

    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 上所有測試用例

pass all test cases at LeetCode

結(jié)論

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

GitHub commit history: LeetCode58_LengthOfLastWord

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容