Edited at

【JavaScript】CodilityのLesson1解答例


背景

Codilityというプログラミング学習サイトの練習問題Lesson1「BinaryGap」を解いた。

オンラインコーディング試験に使われることが多いサービスらしい。

プログラマーを目指す人は、一度くらい触ってみるのも良いかもしれない。

ちなみに、英語のサイト。


問題内容

「自然数Nを2進数に変換し、1と1の間にある0の数を数える」という問題。

例えば、10進法の自然数9は、2進法では1001。この時、求める0の数は2個

また、2進数1000101については、1と1の間にある0の数は3個または1個であるが、多いほうの3個が答えとなる。

2進数1000100000については、1と1の間にある0の数のみ数えるので、答えは3個となる。


コードサンプル(解答例)

今回はJavaScriptで書いた。

1. まず、自然数Nを2進数に変換し、1文字区切りにして配列に入れる。

2. 次に、1と1の間にある0の数を数えて、その数を配列に入れる。文章力がないので具体例を提示。2進数10001001000010を扱う場合、zeroArry = [3, 2, 4, 0]となる。

3. 最後に、上記配列zeroArryの中から最大値を選択。

function solution(N) {

var nbin = N.toString(2); //Nを2進数化
var nArry = nbin.split(""); //配列化
nAryy = nArry.map(Number); //文字を数値に置き換え

var zero = 0; //1と1の間にある0の個数
var zeroArry = []; //0の個数の配列
for (var i = 0; i < nArry.length; i++) {
if (nArry[i] == 0) {
zero++;
} else {
zeroArry.push(zero);
zero = 0;
}
}

return Math.max.apply(null, zeroArry); //0の個数が一番多かったものを取得
}


失敗したコード

while文を使ってあれこれやろうとしたら、処理に時間がかかりすぎて怒られた…

var i = 0;

var zero = 0;
var zeroarry = [];
while (i < narry.length) {
if (narry[i] == 0) {
while (naryy[i] = 0) {
zero++;
i++;
}
zeroarry.push(zero);
zero = 0;
} else {
i++;
}
}


感想

アルゴリズムの勉強したことなかったので、1問解くのに大変時間かかってしまいました…

CodilityにはLessonまだ20個以上あるので、今後も解答例アップしていこうかなーなどと考えています。