紙上得來終覺淺, 絕知此事要躬行, 每天一道 CodeWar 程式設計題目

WytheHuang發表於2018-06-13

古人云: "紙上得來終覺淺 絕知此事要躬行."

程式設計是一門手藝活, 需要不斷練習和實戰才能學的好. PHP基礎尤其重要, 要練習加深對PHP理解. 找了幾個線上程式設計題庫, 但都不支援PHP, 最後選中了CodeWar這個網站, 作為我練習PHP程式設計的.

打怪升級, 從此開始. 每天一道程式設計題目, 鍛鍊自己PHP能力, 順便鍛鍊英文能力, 一舉兩得. 寫完一道題目, 會分析自己思路和對比別人思路, 作成筆記加深印象. 比如有一道題目是用字母表數字替換字串的字元 alphabet_position.題目如下:

In this kata you are required to, given a string, replace every letter with its position in the alphabet. If anything in the text isn't a letter, ignore it and don't return it. As an example:
alphabet_position('The sunset sets at twelve o\' clock.');
Should return "20 8 5 19 21 14 19 5 20 19 5 20 19 1 20 20 23 5 12 22 5 15 3 12 15 3 11" as a string.

我的程式碼是這樣子:

function alphabet_position(string $s): string
{
    // 字母表陣列
    $letterArr = [1 => 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
    // 將引數$s全部小寫, 轉換為目標陣列
    $targetArr = str_split(strtolower($s));
    $result = '';
    // 迴圈目標陣列
    foreach ($targetArr as $value) {
        // 迴圈字母表陣列
        foreach ($letterArr as $k=>$v) {
            // 比較兩個陣列中值,若相等, 取出字母表陣列中鍵
            if ($value == $v) {
                $result .= $k.' ';
            }
        }
    }
    // 去除右邊空格.
    return rtrim($result);
}

我的思路: 用26個字母陣列去對比引數陣列, 符合則返回字母陣列的鍵. 而別人思路讓我學習一些知識和PHP用法.

function alphabet_position_clever(string $s): string
{
    $value = '';
    // 根據正規表示式排除非字元的字串, 轉換為目標陣列, 並迴圈
    foreach(str_split(preg_replace('/[^a-z]/i', '', $s)) as $letter) {
        // 求每個大寫英文字元 ASCII 碼值.
        // A在ASCII表是第65,依次排序25個字母,所以要減去64得到26個字母表正確數字
        $letterToNumber = ord(strtoupper($letter)) - 64;
        // 拼接字串
        $value .= " {$letterToNumber}";
    }
    return trim($value);
}

因此練習程式碼和看別人程式碼可以幫助自己提高程式設計能力. 若有新的思路, 歡迎留言或者在我的github專案留言.
每天都會在github提交一道題目,積少成多. 也歡迎能提供新的看法或者思路讓我學習.萬分謝謝.
文筆不好, 請多見諒.

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章