MySQLのこと。

MySQLのことについてまとめているブログ。他人に見せる用でもなく、自分の勉強備忘録。検索インデックスも外してるので、辿りついた方・・・ようこそ。そんな大した情報ないですよ?!たまにアルゴリズムの練習も

ローテションしたリストから指定されたインデックスの要素を検索する

問題

今日はFind element at given index after a number of rotationsにチャレンジする。

この問題はローテションさせる複数の範囲がネストされたリストで渡されるので、その範囲をローテションさせて、指定されたインデックスの要素を検索する問題。下記の例では、まず[0,2]の範囲でローテションさせて、そのローテションされたリストをさらに[0,3]の範囲でローテションさせる。そして、指定されたインデックスは1なので、その要素を出力する、という問題。

imput: [1,2,3,4,5]
range: [[0,2],[0,3]]
index: 1
output: 3

range: [0,2] → Right Rotation → [3,1,2,4,5]
range: [0,3] → Right Rotation → [4,3,1,2,5]
index 1 is 3

実装

指定されたすべての範囲でリストを実際にローテションさせ、最終的に変更されたリストの指定されたインデックスで要素を返す愚直な方法しか思いつかなかった。そして、この実装には問題もあって、リストが指定されたすべての範囲より小さいときに、インデックスエラーになるので、入力されたリストと、指定されたローテション範囲を比較して、内容に応じた処理を記述する必要がある。


from typing import List


def findElement(numbers: List[int], ranges: List[List[int]], index: int):
    len_list = len(ranges)

    for i in range(len_list):

        len_numbers = len(numbers[ranges[i][0]:(ranges[i][1] + 1)])
        temp = numbers[len_numbers-1]

        for j in range(len_numbers - 1, 0, -1):
            numbers[j] = numbers[j - 1]

        numbers[0] = temp
        # display for check
        print(numbers)

    return numbers[index]


if __name__ == '__main__':
    numbers = [1,2,3,4,5]
    ranges = [[0, 2], [0, 3]]
    index = 1
    print(findElement(numbers, ranges, index))

3