[python]ハッシュ:ベストアルバム


問題の説明


ストリーミングサイトでは、最も多く再生された曲を2曲集め、ベストアルバムを発売します.曲は唯一の番号で区切られており、収録曲の基準は以下の通りである.
まずは
  • でたくさんの曲が流れたタイプを収録
  • まずは
  • タイプで放送された曲を収録
  • タイプで同じ再生回数の曲のうち、まず唯一番号の低い曲を収録する.
  • 曲タイプを表す文字列配列タイプと、曲の再生回数を表す整数配列シナリオを指定する場合は、solution関数を完了し、最適なアルバムを入れる曲の一意の番号を順番に返します.

    せいげんじょうけん

  • タイプ[i]は、固有番号iの楽曲タイプである.
  • play[i]は、唯一i番の曲が再生された回数である.
  • ジャンルはシナリオと同じ長さで、1以上10000以下である.
  • タイプは100個未満です.
  • タイプの1曲なら1曲のみ.
  • すべてのタイプの再生回数が異なります.
  • I/O例


    genresplaysreturn["classic", "pop", "classic", "classic", "pop"][500, 600, 150, 800, 2500][4, 1, 3, 0]

    I/O例説明


    クラシックタイプは1450話を放送し、クラシック曲は以下の通りである.
  • ユニークナンバー3:800再生
  • ユニークナンバー0:500再生
  • ユニークナンバー2:150再生
  • popタイプは3100回再生され、pop曲は以下の通りである.
  • ユニークナンバー4:2500再生
  • ユニークナンバー1:600再生
  • そこで、まずポップタイプの[4,1]番の曲を収録し、クラシックタイプの[3,0]番の曲を収録します.

    マイコード


    初めての試み

    def solution(genres, plays):
        answer = []
        gen_play_idx = dict()
        total_gen_play = dict()
    
        for i in range(len(genres)):
            if genres[i] not in gen_play_idx:
                gen_play_idx[genres[i]] = [(plays[i], i)]
                total_gen_play[genres[i]] = plays[i]
            else:
                gen_play_idx[genres[i]].append((plays[i], i))
                total_gen_play[genres[i]] += plays[i]
        sorted_total_gen_play = sorted(total_gen_play.items(), reverse=True)
    
        for key in sorted_total_gen_play:
            song_list = gen_play_idx[key[0]]
            song_list = sorted(song_list, reverse=True)
            for i in range(len(song_list)):
                if i == 2:
                    break
                answer.append(song_list[i][1])
        return answer
    テスト1〉失敗(0.01 ms,10.4 MB)
    テスト2〉失敗(0.01 ms,10.3 MB)
    試験3〉合格(0.01 ms,10.3 MB)
    試験4〉合格(0.01 ms,10.3 MB)
    テスト5〉失敗(0.08 ms,10.3 MB)
    テスト6〉失敗(0.08 ms,10.1 MB)
    テスト7〉失敗(0.04 ms,10.3 MB)
    テスト8〉失敗(0.04 ms,10.3 MB)
    テスト9〉失敗(0.02 ms,10.2 MB)
    テスト10〉失敗(0.08 ms,10.2 MB)
    テスト11〉失敗(0.02 ms,10.2 MB)
    テスト12〉失敗(0.05 ms,10.2 MB)
    テスト13〉失敗(0.08 ms,10.1 MB)
    テスト14〉失敗(0.08 ms,10.3 MB)
    テスト15〉失敗(0.02 ms,10.4 MB)
    精度:13.3
    合計:13.3/100.0
    テスト例を追加してチェックしました.
    genresplaysreturn["classic", "pop", "classic", "classic", "pop"][500, 600, 150, 800, 2500][4, 1, 3, 0]["classic", "pop", "classic", "classic", "pop"][500, 600, 500, 800, 2500][4, 1, 3, 0]
    2番目のテストケースのように、同じタイプ内で同じ再生回数がある場合、3番目の条件により、まず固有番号の低い曲を収録し、インデックス2番の曲が収録されているため[4,1,3,2]の結果が得られる.song_list = sorted(song_list, reverse=True)このコードを修正すればいいはずです.

    2回目の試み


    song list=sorded(song list,reverse=True)song_list = sorted(song_list, key=lambda x: (-x[0], x[1]))に改訂された.
    def solution(genres, plays):
        answer = []
        gen_play_idx = dict()
        total_gen_play = dict()
    
        for i in range(len(genres)):
            if genres[i] not in gen_play_idx:
                gen_play_idx[genres[i]] = [(plays[i], i)]
                total_gen_play[genres[i]] = plays[i]
            else:
                gen_play_idx[genres[i]].append((plays[i], i))
                total_gen_play[genres[i]] += plays[i]
        sorted_total_gen_play = sorted(total_gen_play.items(), reverse=True)
    
        for key in sorted_total_gen_play:
            song_list = gen_play_idx[key[0]]
            song_list = sorted(song_list, key=lambda x: (-x[0], x[1]))
            for i in range(len(song_list)):
                if i == 2:
                    break
                answer.append(song_list[i][1])
        return answer
    テスト1〉失敗(0.01 ms,10.4 MB)
    テスト2〉失敗(0.01 ms,10.3 MB)
    試験3〉合格(0.01 ms,10.3 MB)
    試験4〉合格(0.01 ms,10.3 MB)
    テスト5〉失敗(0.08 ms,10.3 MB)
    テスト6〉失敗(0.08 ms,10.1 MB)
    テスト7〉失敗(0.04 ms,10.3 MB)
    テスト8〉失敗(0.04 ms,10.3 MB)
    テスト9〉失敗(0.02 ms,10.2 MB)
    テスト10〉失敗(0.08 ms,10.2 MB)
    テスト11〉失敗(0.02 ms,10.2 MB)
    テスト12〉失敗(0.05 ms,10.2 MB)
    テスト13〉失敗(0.08 ms,10.1 MB)
    テスト14〉失敗(0.08 ms,10.3 MB)
    試験15〉合格(0.02 ms,10.4 MB)
    精度:20.0
    合計:20.0/100.0
    あと1つで...
    体裁の種類は100個未満と言われていますが、体裁の問題かもしれません.
    genresplaysreturn["classic", "pop", "hiphop", "classic", "pop"][500, 600, 1400, 800, 2500][4, 1, 2, 3, 0]
    ヒップホップスタイルに変えてテストしました「テストに合格しました」この問題ではありません.

    3回目の試み


    genresplaysreturn["classic", "pop", "classic", "classic", "pop"][500, 500, 500, 500, 500][0, 2, 1, 4]
    今回はすべてのプレイ値を500にしました.
    実行される結リンゴ値[1,4,0,2]は、基数[0,2,1,4]とは異なる.うん.パイは本当にデバッグしてみましょう.

    sorded total gen playでは「classic」は1500ですが、popが最初に現れます.ここも上のようにラムダを入れてアレンジしてもいいです
    ソートされたtotal gen play=sorded(total gen play.items()、reverse=True)sorted_total_gen_play = sorted(total_gen_play.items(), key=lambda x: -x[1])に変更
    def solution(genres, plays):
        answer = []
        gen_play_idx = dict()
        total_gen_play = dict()
    
        for i in range(len(genres)):
            if genres[i] not in gen_play_idx:
                gen_play_idx[genres[i]] = [(plays[i], i)]
                total_gen_play[genres[i]] = plays[i]
            else:
                gen_play_idx[genres[i]].append((plays[i], i))
                total_gen_play[genres[i]] += plays[i]
        sorted_total_gen_play = sorted(total_gen_play.items(), key=lambda x: -x[1])
    
        for key in sorted_total_gen_play:
            song_list = gen_play_idx[key[0]]
            song_list = sorted(song_list, key=lambda x: (-x[0], x[1]))
            for i in range(len(song_list)):
                if i == 2:
                    break
                answer.append(song_list[i][1])
        return answer
    やっと...
    精度:100.0
    合計:100.0/100.0

    他人の考え

    def solution(genres, plays):
        genres_dict = {}
        genres_list = []
        for i in range(len(genres)):
            if genres[i] not in genres_dict:
                genres_dict[genres[i]] = []
            genres_dict[genres[i]].append([i, plays[i]])
    
        for g in genres_dict:
            genres_dict[g].sort(key=lambda x: x[1], reverse=True)
            genres_list.append([g, sum([play for _, play in genres_dict[g]])])
    
        genres_list.sort(key=lambda x: x[1], reverse=True)
        answer = []
        for g, _ in genres_list:
            answer.extend([x[0] for x in genres_dict[g][:2]])
        return answer
    私は調子を作って、それをディックシャーナに入れました.このコードはリストをディックシャーナに入れました.上の最初のfor文では、タイプをキーとして、Valueにインデックスと再生数からなるリストを追加します.2番目のfor文ではgenesリストで各タイプの合計を求めて挿入します.最後のfor文に最初の2つのインデックス値を追加します.