MySQLのこと。

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

リストのローテーションのいろいろ

問題

配列が与えられたら、配列の要素を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]