問題
配列が与えられたら、配列の要素を1つ時計回り、反時計回りに回転させる。反時計に回す場合は、for文、while文、indexErrorを条件に使い、リストのメソッドは使わない。簡単な問題かもしれないが、何事も練習あるのみ・・・。
input: [1,2,3,4,5] ↓ output: [5,1,2,3,4] output: [2,3,4,5,1]
実装
配列が与えられたら、配列の要素を1つ時計回りに回転させる。これまでも何回かリストのローテーションの話はまとめているので、実装例だけのせておく。
from typing import List
def right_rotate(numbers: List[int]):
len_numbers = len(numbers)
tmp = numbers[len_numbers-1]
for i in range(len_numbers-1, 0, -1):
numbers[i] = numbers[i-1]
numbers[0] = tmp
return
if __name__ == '__main__':
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers)
right_rotate(numbers)
print(numbers)
[1, 2, 3, 4, 5, 6, 7]
[7, 1, 2, 3, 4, 5, 6]
実装
配列が与えられたら、配列の要素を1つ反時計回りに回転させる。リストのメソッドは使わないでやるので、こういうのはなし。
from typing import List
def rotate_list(numbers: List[int]):
tmp = numbers.pop(0)
numbers.append(tmp)
return
if __name__ == '__main__':
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers)
rotate_list(numbers)
print(numbers)
[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7, 1]
実装
配列が与えられたら、配列の要素を1つ反時計回りに回転させる。まずは、for文を使うパターン。
from typing import List
def left_rotate(numbers: List[int]):
len_numbers = len(numbers)
tmp = numbers[0]
# for i in range(len_numbers-1): ok
for i in range(0, len_numbers-1, 1):
numbers[i] = numbers[i+1]
numbers[-1] = tmp
return
if __name__ == '__main__':
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers)
left_rotate(numbers)
print(numbers)
[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7, 1]
実装
配列が与えられたら、配列の要素を1つ反時計回りに回転させる。次は、while文を使うパターン。条件判定にはリストの長さを使って、IndexError
にならないようにする。
from typing import List
def left_rotate_while(numbers: List[int]):
len_numbers = len(numbers)
tmp = numbers[0]
i = 0
while i < len_numbers-1:
numbers[i] = numbers[i+1]
i += 1
numbers[-1] = tmp
return
if __name__ == '__main__':
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers)
left_rotate_while(numbers)
print(numbers)
[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7, 1]
実装
配列が与えられたら、配列の要素を1つ反時計回りに回転させる。次は、while文の条件判定にIndexError
を使う場合。通常、こんなことはしないだろうけど、練習練習。IndexError
を判定させる関数や方法がtry-catch
文しか見つけれなかったので、素直にtry-catch
文で、bool値を返すようにして、それを条件判定で利用する。numbers[i+1]
でIndexError
にならないようにしたいので、is_next_IndexError()
ではnumbers[index+1]
として、1つ先を判定している。
from typing import List
def is_next_IndexError(numbers, index):
try:
numbers[index+1]
except IndexError:
return True
else:
return False
def left_rotate_while_v2(numbers: List[int]):
len_numbers = len(numbers)
tmp = numbers[0]
i = 0
while not is_next_IndexError(numbers, i):
numbers[i] = numbers[i+1]
i += 1
numbers[-1] = tmp
return
if __name__ == '__main__':
numbers = [1, 2, 3, 4, 5, 6, 7]
print(numbers)
left_rotate_while_v2(numbers)
print(numbers)
[1, 2, 3, 4, 5, 6, 7]
[2, 3, 4, 5, 6, 7, 1]