はじめに
個人的に好きなアルゴリズム学習サイト「CodeWars」の問題をシェア。
週1くらいのペースで、全10回を目指す予定。
オススメ問題
問題
与えられた文字列にx
とo
が同数含まれているかを返す問題です。
含まれていない場合は0
としてカウントします。
XO("ooxx") => true
XO("xooxx") => false
XO("ooxXm") => true
XO("zpzpzpp") => true // when no 'x' and 'o' is present should return true
XO("zzoo") => false
難易度
分類は 7kyu です。
アルゴリズム問題に慣れてきた方にオススメです。
オススメの回答
「評価が高い回答」の中から、学びの多い回答をピックアップしてご紹介。
オーソドックスな解法
const XO = str => {
str = str.toLowerCase().split('');
return str.filter(x => x === 'x').length === str.filter(x => x === 'o').length;
}
- アロー関数
const XO = str => {}
という記法が用いられています
function XO(str) {}
と意味はほぼ同じです -
filter
を使って、'x'
に一致するもの、'o'
に一致するものの数を出し、比較しています
オーソドックスな解法(正規表現)
function XO(str) {
let x = str.match(/x/gi);
let o = str.match(/o/gi);
return (x && x.length) === (o && o.length);
}
-
/x/gi
は、x
に一致する全て(/g
)に、大文字小文字の区別無し(/i
)でマッチします
個人的に好きな回答
function XO(str) {
var a = str.replace(/x/gi, ''),
b = str.replace(/o/gi, '');
return a.length === b.length;
}
先程の正規表現との違いは、match
ではなくreplace
メソッドを使用していることです。
match
の場合、マッチしたものが存在しない時、存在しないものに対しlength
メソッドが使用されエラーになります。
replace
を使用することにより、マッチしなくとも元の文字列に対しlength
が使用されるため、エラーにはなりません。
よって、よりスマートなコードになっています。
ただし、replace
はパット見何をしているかわかりません。意図の伝わりやすさという点でmatch
を使用するのが一般的でしょう。
おわりに
以上、CodeWarsオススメ問題でした。