問題
今日は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