MySQLのこと。

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

リストの要素をリバースする問題

問題

今日はWrite a program to reverse an array or stringの問題にチャレンジする。この問題は、リストの要素をリバースする問題。

Input : [1, 2, 3]
Output: [3, 2, 1]

Input : [4, 5, 1, 2]
Output: [2, 1, 5, 4]

実装

基本的な方針は、start, endの2つのインデックスを用意し、startは左から右に、endは右から左にインデックスを操作し、挟み撃ちしながら、各位置の要素をスワップしていけば、リバースすることができる。インデックスが交わる部分は、リストが[4, 5, 1, 2]のように偶数であれば、[start=0, end=3]→swap→[start=1, end=2]→swap→[start=2, end=1]→falseとなり、不要な要素の入れ替えが発生しない。一方でリストが[1, 2, 3, 4, 5]のように奇数の場合は、[start=0, end=4]→swap→[start=1, end=3]→swap→[start=2, end=2]→falseとなり、真ん中の要素の入れ替えが発生しない。



from typing import List

def swap(numbers: List[int]) -> List[int]:
    start = 0
    end = len(numbers) - 1

    while start < end:
        numbers[start], numbers[end] = numbers[end], numbers[start]
        start += 1
        end -= 1

if __name__ == '__main__':
    numbers = [4, 5, 1, 2]
    print(numbers)
    swap(numbers)
    print(numbers)

    numbers = [1, 2, 3]
    print(numbers)
    swap(numbers)
    print(numbers)

    numbers = [1,2,3,4,5,6,7,8,9]
    print(numbers)
    swap(numbers)
    print(numbers)

[4, 5, 1, 2]
[2, 1, 5, 4]
[1, 2, 3]
[3, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

実装

このような繰り返すような処理は再帰を使っても書き直せる。



from typing import List

def swap2(numbers: List[int], start: int, end: int) -> List[int]:
    if start >= end:
        return
    numbers[start], numbers[end] = numbers[end], numbers[start]
    swap2(numbers, start+1, end-1)

if __name__ == '__main__':
    numbers = [4, 5, 1, 2]
    print(numbers)
    swap2(numbers, 0, len(numbers) - 1)
    print(numbers)

    numbers = [1, 2, 3]
    print(numbers)
    swap2(numbers, 0, len(numbers) - 1)
    print(numbers)

[4, 5, 1, 2]
[2, 1, 5, 4]
[1, 2, 3]
[3, 2, 1]