codilityの練習問題を解いてみます。

解きながら記事にしているので、文章がだいぶ雑です。

言語はPython。Lesson1はPythonで解いて記事にしている人がいたのでパスします。

では問題文

An array A consisting of N integers is given. Rotation of the array means that each element is shifted right by one index, and the last element of the array is moved to the first place. For example, the rotation of array A = [3, 8, 9, 7, 6] is [6, 3, 8, 9, 7] (elements are shifted right by one index and 6 is moved to the first place).

「Nこの整数で構成された配列がある。配列の回転とは、それぞれの要素を1インデックス右にずらすことを意味する。そして、最後の要素は先頭に持っていく。

例えば、[3,8,9,7,6,]の回転は[6,3,8,9,7]である。」

The goal is to rotate array A K times; that is, each element of A will be shifted to the right K times.

Write a function

def solution(A, K)

「目標は配列AをK回、回転させることである。」

うーーん。そんなに難しくはなさそう。ただ、前の問題もいろいろ引っかかったので、Jupyter notebookで検証しながら書きます。

ちなみに答え方は配列Aと実数Nを引数にすると答えを出せる solution(A, K)を定義する感じです。

で、

def solution(A, K):
    # write your code in Python 3.6
    n_A = len(A)
    B = []
    
    for i in A[n_A-K::]:
        B.append(i)
    for i in A[:n_A-K:]:
        B.append(i)
        
    return B

 

n_Aが配列の要素数。Bが回転後の配列

簡単じゃない?って思いました。こういう時pythonだと便利ですよね。Cで書いたら余計な行が5,6行増えそうです。

でも、

small functional tests, K >= N

WRONG ANSWER

ってなりました。

どうやら回転数が要素数を超えるとダメみたいです。

    while K > n_A:
        K = K - n_A

 

このコードをfor文の前に追加。ついでにAが空の時エラーが出るので、最初に分岐を付けました。

def solution(A, K):
    # write your code in Python 3.6
    n_A = len(A)
    B = []
    
    if A == []:
        B = A
    else:
        while K > n_A:
            K = K - n_A
    
        for i in A[n_A-K::]:
            B.append(i)
        for i in A[:n_A-K:]:
            B.append(i)
    return B

 

これで一応100点でしたが、なんかスマートじゃないですね。ついでに、時間もかかりました。

スライスができればメインのところは簡単でしたが、細かいまで気にしないといけなそうです。

そのためにも一度、違う環境で実行してみる必要がありそうですね。

 

それでは。