[Programmers][Python]機能の開発

16441 ワード

質問する




に答える


Trual 1 stプール

import math
def solution(progresses, speeds):
    left = []
    result = []
    for i, v in enumerate(progresses):
        left.append(math.ceil((100-v)/speeds[i]))
    
    key = left[0]
    count = 1
    for i in range(1, len(left)):
        if key >= left[i]:
            count += 1
        else:
            left.append(count)
            key = left[i]
            count = 1
    result.append(count)
        
    return result
回答は次のとおりです.
  • の進捗に従って、作成100の回数を探して左のリストに保存します.
  • 左リストの最初の要素をキーとしてcountを1に初期化します.
  • と同じまたは小さい要素が現れると、各要素にcountが追加されます.より大きな要素が現れると、前に蓄積したcountが結果リストに追加され、新しいキーでcountが更新され、countは1に初期化されます.

  • 解けましたが、いくつか残念な点がありました.
    第一に、私は100以上の数字を加える方法が好きではありません.mathライブラリをmathと呼ぶ私はceil関数を書きましたが、これ以上良い方法はありませんか?
    (progress + iterator*speeds) ≥ 100
    前述したように、100以上であることを確認すれば、アップロード機能を使わなくてもよい.
    2つ目は残念なことに、この問題タイプはスタック/キューであり、私が書いたコードはスタックの特徴をよく体現していない.最初のインデックス要素をpop()に編成すれば、キューのように実現できます.(例えばpop(0))

    Trual 2 ndプール

  • 反復器として機能する変数を宣言し、最初の要素の進捗が100%以上になるまで宣言します.
  • の条件が満たされると、最初の要素が進捗および速度でそれぞれポップアップされます.
  • 配置する
  • 0機能の数を示す変数countを追加します.
  • 現在progress[0]は、次の作業の進捗状況を指します.動作時間がiを超えると、同じ時間またはそれ以下の時間が必要になり、2つのキューのpopとcountが同時に増加します.
  • 100未満のジョブに遭遇した場合、その前のcountは正解リストに追加され、countは0に初期化されます.
  • 進捗キュー要求まで、上記の操作を繰り返します.
  • 以下に示すように、コードとして表します.
    def solution(progresses, speeds):
        print(progresses)
        print(speeds)
        answer = []
        time = 0
        count = 0
        while len(progresses)> 0:
            if (progresses[0] + time*speeds[0]) >= 100:
                progresses.pop(0)
                speeds.pop(0)
                count += 1
            else:
                if count > 0:
                    answer.append(count)
                    count = 0
                time += 1
        answer.append(count)
        return answer

    コードはもっときれいになったようですが、時間が増えました.
    これは,1番目のコードでo(1)がタスクを完了するのに要する時間を求め,2番目のコードではwhileゲートを回すことで探すためである可能性がある.
    問題の意図に合っているかどうかはわかりませんが...mathライブラリが使えるなら、最初のコードのように書くのもいいようです.

    Trial 3 rdプール


    教授はzip()関数の使用を推奨する.
    zip関数
    同じ長さのiterable資料型(リスト、図例)の各要素をインデックス順に組み合わせて、新しいiterable資料型を生成します.
    a = [1, 2, 3]
    b = ['mon', 'tue', 'wed']
    c = ['red', 'green', 'blue']
    new_zip = zip(a, b, c)
    前述したように、印刷後印刷(type(new zip)、出力はclass<'zip'>である.<class 'zip'>print(list(new zip))を使用してlistタイプに変換できます.[(1, 'mon', 'red'), (2, 'tue', 'green'), (3, 'wed', 'blue')]
    for x, y in zip(range(10), range(10)):
    	print(x, y)
    iterableデータ型を作成しないで、for文を使用して新しいzipクラスを作成することもできます.
    dict_num = { x:y for x, y in zip(range(10),range(10))}
    zip()関数と理解を使用してディックシリーズを生成できます.{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}zip()関数のほかに,Pythonの除算演算方式が新たに認識された.
    cでは、除算演算を行う際に、小数点の後部を完全に捨て、除算の整数部分を得る.
    一方、Pythonは내림を使用してシェアを表している.
    例とともに表示:
    C(捨てる)Python(下ろす)7/3=2.333…=27/3 = 2.333 ... = 27/-3 = -2.333 ... = -27/3 = -2.333 = -3
    シェアが下がるにつれて、残りの値も変わります.
    C(廃棄)Python(廃棄)7=3*2+17=3*2+17=(-3)*(-2)+17=(-3)*(-3)+(-2)
    C言語ではX%Y(7%3)の演算結果はXの符号と同じである.また、3を姉-3で割ると姉の結果になります.逆にPythonではX%Y(7%-3)演算結果の符号はYの符号と同一である.math.ceilを使用しないで、小数点を上に移動するにはどうすればいいですか?考えたことがあります.
    pythonのドロップダウン演算特性を用いて簡単に解決できる.
    100-xではなく、x-100で負数を求め、分けて-を加えて正数にします.
    -((p-100)//s
    また,リスト内の負数インデックスは後ろから逆数になる.
    a = list(range(10))
    print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(a[-1], a[-2]) # 9 8
    -1インデックスを使用するのは、リストの最後のエントリを追跡するための要素です.
    本問題では,所要時間が増加するとzipの最初のコラムで更新されるためresult[1][0]と−(p−100)/s)を比較し,結果に要する時間よりも長い場合を見出すことができる.
    最終コード!
    def solution(progresses, speeds):
    
        result=[]
    
        for p, s in zip(progresses, speeds):
    
            if len(result)==0 or result[-1][0]<-((p-100)//s):
    
                result.append([-((p-100)//s),1])
    
            else:
    
                result[-1][1]+=1
    
        return [i[1] for i in result]

    前の2つのコードに比べて、テストケース7から確認できる時間が減りました!