[プログラマ]機能の開発


🍕 問題の説明


プログラマチームは機能強化を実行しています.各機能は、進捗が100%の場合にサービスに反映されます.
また、各機能の開発速度が異なるため、後の機能は前の機能の開発より先に、後の機能は前の機能の導入時に一緒に導入される可能性があります.
まず、ソリューション関数を完了し、特定の整数配列の進捗状況(必要に応じて配置される順序)と整数配列速度(タスクごとの開発速度)のときに、各配置にどれだけの機能があるかを返します.
-->機能開発の詳細の表示

🥙 せいげんじょうけん


タスクの数(進捗、速度配列の長さ)は100個を超えません.
作業の進捗は100未満の自然数です.
動作速度が100以下の自然数.
導入は1日に1回しか行われず、1日の終了時に完了すると仮定します.たとえば、開発の進捗状況が95%のタスクの速度が1日4%の場合、導入は2日後に完了します.

🧀 JAVA池

import java.util.Arrays;
import java.util.Stack;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
    	// 1.
        Stack<Integer> stack = new Stack<>();
        // 2. 
        int remain;
        // 3. 
        int max = 0;
        // 4.
        for(int i=0; i<progresses.length; i++){
            // 5.
            remain = (100 - progresses[i])/speeds[i] + ((100 - progresses[i]) % speeds[i] != 0 ? 1:0);
            // 6.
            if (!stack.isEmpty() && max >= remain){
                stack.set(stack.size()-1,stack.peek()+1);
            }else{
               // 7.
                max = remain;
                stack.push(1);
            }
        }
        // 8.
        return stack.stream().mapToInt(i->i).toArray();
    }
}
-->草を見に行く

🎪 問題を解く


  • この問題のカテゴリがスタック/キュー項目に含まれていることからヒントを得た後,スタック資料型の使用を決定する.


  • まず,反復文で継続的に使用される各機能を数日連続で導入できる変数を発表した.反復文で値付けに使用されるため、初期値は指定されていません.

  • 配置時間が長すぎる場合は、後続の機能を最大配置時間を含む変数と見なして、配置が終了する前に一緒に配置された機能を処理できます.

  • progress配列と速度は1:1の関係であるため,各インデックスを参照するためにprogress配列の長さが返される.
  • (100 - progresses[i])は、各機能の残りのワークロードである.
    残りの作業量を作業速度speeds[i]で割ると配布可能な日付が得られ、割らないと1日かかるので1を加算します.+ ((100 - progresses[i]) % speeds[i] != 0 ? 1:0)

  • 各配布に含まれる数字を積み重ねていく番です.
    スタックが空でなく、最大配置日が現在のインデックスに含まれる機能の配置可能日より大きい場合、前のタスクの配置はまだ完了していないため、stack.set(stack.size()-1,stack.peek()+1);を使用してスタックの最後の位置の値を1増加します.
    ここでstackの値を変更するために、stack.set()を使用してstackの値をクエリーするだけでなくstackの値を使用します.peek()を使用しました.

  • スタックが空の場合、または現在のインデックスの配置日の値がmaxの配置日より大きい場合、maxには現在のインデックスの配置日が含まれ、スタックに新しい1(push)が追加されます.

  • 最後に、戻り値がint型配列であるため、スタックを配列に変更するには、ストリーム内のmapToInt(i->i)を使用してIntegerをint型に変更し、toArray()を使用して配列に変更します.
  • パフォーマンステスト


    せいど
    試験1〉合格(3.67 ms,52.2 MB)
    テスト2〉合格(4.03 ms,53.5 MB)
    試験3〉合格(8.78 ms,52.7 MB)
    試験4〉合格(4.96 ms,52.3 MB)
    試験5〉合格(3.69 ms,53.1 MB)
    試験6〉合格(3.26 ms,52.4 MB)
    試験7〉合格(2.55 ms,52.7 MB)
    試験8〉合格(9.08 ms,53.1 MB)
    試験9〉合格(14.15 ms,52.9 MB)
    テスト10〉合格(4.53 ms,53.4 MB)
    テスト11〉合格(6.33ミリ秒、53 MB)

    👓 草を切る

    def solution(progresses, speeds):
        answer = []
        val = 0
        for i in range(len(progresses)):
            remain = (100 - progresses[i])//speeds[i] + (1 if (100 - progresses[i]) % speeds[i] else 0)
            if answer and val >= remain:
                answer[-1] += 1
            else:
                answer.append(1)
                val = remain
        return answer
    -->草を見に行く
    Javaは論理と同じです.

    パフォーマンステスト


    せいど
    試験1〉合格(0.01 ms,10.2 MB)
    試験2〉合格(0.04 ms,10.1 MB)
    試験3〉合格(0.03 ms,10.2 MB)
    試験4〉合格(0.02 ms,10.2 MB)
    試験5〉合格(0.03 ms,10.2 MB)
    試験6〉合格(0.01 ms,10.2 MB)
    試験7〉合格(0.03 ms,10.1 MB)
    試験8〉合格(0.01 ms,10.2 MB)
    試験9〉合格(0.02 ms,10.2 MB)
    試験10〉合格(0.03 ms,10.1 MB)
    試験11〉合格(0.01 ms,10.2 MB)
    [ソース:プログラマ]

    🎃 の最後の部分


    今初めてプログラマーレベル2に入りました.
    確かに1級より難易度が高いです.
    単純な解答でも良い結果が得られるレベル1とは異なり,第2段階では多くの問題を考慮する必要がある.
    今回の問題は解決する人が多いのでそんなに難しくはありませんが.
    他の問題を解決した後、効率も徹底的にテストされました...
    また,現在のJavaの場合は無条件にArrayListで解決するのではなく,スタック,Q,ハッシュ,hipなど様々な資料型を知る場合に用いる.
    資料型について知らない場合、問題解決の難しさが大きすぎて、コードテストよりも本を買った.
    努力して2級を走って、3級を簡単に身につける実力になりたい.