JavaScript
codility

【JavaScript】CodilityのLesson2-1解答例


背景

Codilityというプログラミング学習サイトのLesson2「CyclicRotation」を解いた。


問題内容

「配列Aの要素をK個分となりに移した際の配列を求めよ」という問題。

例えば、A = [a, b, c, d, e] K = 3の場合、求める配列は、[c, d, e, a, b]となる。


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

今回はJavaScriptで書いた。

1. 要素が5個の配列を3回移動させる場合、この配列の4番目の要素は、配列の2番目に移動する。つまり、(4 + 3) / 5の余り2を求める形とすれば良い。※5は配列の長さ。

2. 上記を求めた後、各要素を求める配列に代入すれば答えとなる。

function solution(A, K) {

// write your code in JavaScript (Node.js 8.9.4)
var newA = []; //答えとなる配列
for (var i = 0; i < A.length; i++) {
var j = (i + K) % A.length; //余りを求める
newA[j] = A[i];
}
return newA;
}


失敗したコードその1

求める配列newA = 与えられた配列Aとして始めようとしたら、怒られた。

失敗例

A = [3, 8, 9, 7, 6] K = 3の場合、for文の処理中に以下のようになったと思う。

1. [3, 8, 9, 3, 6]

2. [3, 8, 9, 3, 8]

3. [9, 8, 9, 3, 8]

4. [9, 3, 9, 3, 8]

5. [9, 3, 8, 3, 8]

以上のように、newAの中身がごちゃごちゃになってしまったらしい。(おそらく)

function solution(A, K) {

// write your code in JavaScript (Node.js 8.9.4)
var newA = A;
for (var i = 0; i < A.length; i++) {
var j = (i + K) % A.length;
newA[j] = A[i];
}
return newA;
}

> Example test:    ([3, 8, 9, 7, 6], 3) 

> WRONG ANSWER (got [9, 3, 8, 3, 8] expected [9, 7, 6, 3, 8])


失敗したコードその2

newA[i] = A[j]にしても同じ結果になると思ってしまった。

newA[0] = A[3]newA[3] = A[0]、全然違いました。

function solution(A, K) {

// write your code in JavaScript (Node.js 8.9.4)
var newA = [];
for (var i = 0; i < A.length; i++) {
var j = (i + K) % A.length;
newA[i] = A[j];
}
return newA;
}

> Example test:    ([3, 8, 9, 7, 6], 3) 

> WRONG ANSWER (got [7, 6, 3, 8, 9] expected [9, 7, 6, 3, 8])


感想

Lesson1を解いた時よりは早く解けた。

所要時間は、解法思いつくのに15分、コード書くのに15分くらい。

まだまだ精進していかねば…

他の解答などあったら是非コメントにお願いします。