[アルゴリズム]電話番号リスト

4060 ワード

1.質問



2.私の解答(失敗)

def solution(phone_book):
    
    phone_book = [ i[0:2] for i in phone_book ]
    phone_book.sort()
    
    for i in range(len(phone_book)-1) :
        if phone_book[i] == phone_book[i+1] : return False
        
    return True
異常に3をテストし、11で失敗したソースコードをテストします.
ソースコードを簡単に説明すると、文字列の最初の2つをリストに保存し、set()を使用して重複を解消し、2つの長さを比較し、同じ接頭辞が存在しないと判断し、同じ場合は接頭辞が存在し、falseを返します.
問題を誤って理解するのはたいへん大きい.1つの電話番号は別の電話番号の接頭辞であるべきで、これは1つの電話番号が別の電話番号の先頭に属するべきであることを意味し、[0:2]のように線を引くとデータが破損し、正確な比較ができない.

3.他人の回答

def solution(phone_book):
    phone_book.sort()
    for p1, p2 in zip(phone_book, phone_book[1:]):
        if p2.startswith(p1):
            return False
    return True
より簡潔なアルゴリズム.すべての電話番号を比較しないで、sortの後でzipを使って2つの隣接する電話番号だけを比較します.この場合、startswithを使用して、2つの電話番号が接頭辞であるかどうかを比較します.

4.勉強するところ

  • zip()
  • startswith()