[プログラマー][ハッシュ]電話番号リスト


2.電話番号リスト


私の髪の草

def solution(phone_book):
    answer = True
    phone_book.sort()
    for i in range(0, len(phone_book) - 1):
        if(phone_book[i] == phone_book[i+1][0:len(phone_book[i])]):
            answer = False
            break
    return answer
基本的な解法は,受信したphone bookをソートし,隣接値間を比較し,時間的複雑度N以内で解く.解法はあまり難しくなく、考えにくい原因は以下の通りです.
  • の数字形式の文字列をソートすべきだとは思いません.
  • phone bookの長さは百万に達しているので、絶対に二重砲口はできません.
  • ソート方法はlistです.sort()とsorded(list)がありますが、両者の最大の違いは元のリストに影響しますか?はい.

    list.sort()

    a = [1, 2, 3]
    a.sort(key=lambda x: x, reverse=True)
    print(a)
    >>> [3, 2, 1]
    list.sort()は元のリスト自体を担当する.sort内部パラメータはkeyとreverseを提供することができる.keyは、何を基準に昇順するかを決定することができ、このときx:基準を加えればよい.標準は、サンプルと一致しない(x[0],x[1])が、複数のパラメータを優先順位で与えることもできる.reverseがtrueに設定されている場合、降順で変更されます.

    sorted(list)

    a = [1, 2, 3]
    b = sorted(a, key=lambda x: x, reverse=True)
    print(a)
    >>> [1, 2, 3]
    print(b)
    >>> [3, 2, 1]
    ソート(list)は元のリストに影響しません.上記の結果に示すように、元のaリストは変わらない.残りのパラメータはlistです.sort()と同じです.

    最適なシナリオ

    def solution(phoneBook):
        phoneBook = sorted(phoneBook)
    
        for p1, p2 in zip(phoneBook, phoneBook[1:]):
            if p2.startswith(p1):
                return False
        return True
    ここではzip関数を使用します.Pythonで解くたびに便利な関数が出てくるようです.

    zip関数


    zip関数はPythonの内蔵関数で、グループ内のデータを相互に関連付けます.zip()関数は、複数のループ可能なオブジェクトをパラメータとして受信し、各オブジェクトに含まれる要素にパターン形式で順次アクセスできる反復器(iterator)を返します.
    phoneBook = ["119", "97674223", "1195524421"]
    print(zip(phoneBook, phoneBook[1:]))
    >>> <zip object at 0x000001E4E29B9208>
    
    phoneBook = ["119", "97674223", "1195524421"]
    for p1 ,p2 in zip(phoneBook, phoneBook[1:]):
        print(p1, p2)
    >>> 119 97674223
    >>> 97674223 1195524421
    これによりzip自体を印刷すると、ウィジェットオブジェクトが返されます.これに対し、このウィジェットで巡回パラメータを印刷すると、値が得られます.ここでは紹介していませんが、解題で文字列を紹介した後、startswith関数で接頭辞かどうかを判断します.startswith関数のパラメータはtupleまたはstring値であってもよい.