[programmers/Python/hash]-電話番号リスト


ソース:https://programmers.co.kr/learn/courses/30/lessons/42577
コードを書くときに必ずしも書く必要がない場合は、重複した複文はできるだけ書かないようにします.
しかし、最初に思いついたのはこれだけで、効率テストでは空っぽになるかもしれませんが、先に提案しました.
# 전화번호부에 적힌 전화번호를 담은 배열 phone_book 

# 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false
# 그렇지 않으면 true를 return 하도록 solution 함수

def solution(phone_book):
    answer = True
    
    for i in phone_book:
        for j in phone_book:
            if (j[0:len(i)]==i) and (j != i):
                answer = False  
            
    return answer
正確性テストはすべて正しいが、効率性テストでは0点を取った.

文trueの場合falseが返されます
そうでなければreturn trueで書くと繰り返し実行する回数は減りますが、根本的な解決ではないかもしれませんが、失敗してしまいます.

問題のI/Oの例を読み直し、list要素のtypeはintではなくstrであると考えられるので並べ替えたほうがよい.
list = ["12", "13", "123"]
list.sort()
print(list) #['12', '123', '13']
上記のように、要素のtypeが数値型の場合、list.sort()の場合["12"、"13"、"123"]の順であるがtypeはstrであるため、数字の文字列比較順に["12"、"123"、"13]となる.
したがって、ソート後に前後の要素だけを比較すると、1つの番号が別の番号の接頭辞であるかどうかを知ることができます.
文字列に特定の文字が含まれているかどうかを検索するためにfindを使用しようとしましたが、検索してみるとstartswithを使用して特定のstrで始まるかどうかを知ることができます.
def solution(phone_book):
    answer = True

    phone_book.sort()

    for zip1, zip2 in zip(phone_book, phone_book[1:]):
      if zip2.startswith(zip1):
        answer = False

    return answer

phone_book.sort()の後は前後の要素を比較するだけでよいのでzip()にphone bookとphone book[1]を入れ、for文で各要素間のstartswithを判断する.

他人の解答

def solution(phone_book):
    answer = True
    hash_map = {}
    for phone_number in phone_book:
        hash_map[phone_number] = 1
    for phone_number in phone_book:
        temp = ""
        for number in phone_number:
            temp += number
            if temp in hash_map and temp != phone_number:
                answer = False
    return answer
テーマの中の問題なので、テーマで解決する問題を探しました.

整理する


strA.startswith(strb、開始点)
True Falseを返し、strAがstrbで始まるかどうかを決定します.
因数で始点を指定することもできます.