JavaでのProgrammer機能の開発


質問する


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

せいげんじょうけん


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

に近づく


まず、progressの最初の要素を100に上げ、最初のprogressが100に達した瞬間にqueueから一つ一つ削除し、100の話countをresponse配列に上げてアクセスします.最も原始的にコードに近づき、記述した.
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
    	List<Integer> queue = new ArrayList<>();   
        List<Integer> speeds_list = new ArrayList<>();
    	List<Integer> answer_arr = new ArrayList<>();   
        
        // create progress arraylist
        for(int p=0; p<progresses.length; p++){
            queue.add(progresses[p]);
            speeds_list.add(speeds[p]);
        }
       
        // set break point using queue
        while(!queue.isEmpty()){
            int size = queue.size();
            int count = 0;
            // process tasks within each speed
            while(queue.get(0) < 100){
                for(int i=0; i<size; i++){
                    queue.set(i, queue.get(i) + speeds_list.get(i));
                }
            }
            
            // count element over 100
            for(int j=0; j<size; j++){
                if(queue.get(j) >= 100){
                    count++;
                }else{
                    break;
                } 
            }
            
            // add count into answer array list
            answer_arr.add(count);
            
            while (count > 0) {
                queue.remove(0);
                count--;
            }
        }
          
        // arraylist to array
        int[] answer = new int[answer_arr.size()];
        for(int l=0; l<answer_arr.size(); l++){
            answer[l] = answer_arr.get(l);
        }
        
        return answer;
    }
}
メモリオーバーフローはやっと回避できましたが、基本的なテストケースに合格しただけで、ほとんどのテストケースのコミットに失敗しました.Googleで答えを検索したところ、これまでの進捗状況を保存する必要があることがわかりました.したがって,1つの時間変数を宣言し,1つの進捗終了時の数回目の進捗を保存して計算する.
失敗したテストケースは次のとおりです.[0, 0, 0, 0] [100, 50, 34, 25] [1, 1, 1, 1]通過したコードは以下の通りです.
import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
    	List<Integer> queue = new ArrayList<>();   
        List<Integer> speeds_list = new ArrayList<>();
    	List<Integer> answer_arr = new ArrayList<>();   
        int time = 0;
        int count = 0;
        
        // create progress arraylist
        for(int p=0; p<progresses.length; p++){
            queue.add(progresses[p]);
            speeds_list.add(speeds[p]);
        }
        
        while(!queue.isEmpty()){
            if(queue.get(0) + time*speeds_list.get(0) >= 100){
                count++;
                queue.remove(0);
                speeds_list.remove(0);
            }else{
                if(count > 0){
                    answer_arr.add(count);
                    count = 0;
                }
                time++;
            }
        }
        answer_arr.add(count);
         // arraylist to array
        int[] answer = new int[answer_arr.size()];
        for(int l=0; l<answer_arr.size(); l++){
            answer[l] = answer_arr.get(l);
        }
        return answer;
	}
}
解答のアルゴリズムを羽センターにアップロードし、ブログにもアップロードします.ほとんどの問題はleetcodeで解決され、プログラマーの中でも一つ一つ解決されます.プログラマーの問題はハングルで書かれていて、ほとんどの問題は長いので、問題自体を理解して解決方法を考えるのに時間がかかります.しかし、このような授業も学べると思うので、2段階から順にプログラマーの質問に答えるつもりです.
以下はこれまでleetcodeの問題を解いた内容です.自分が見たかったので、説明は不実ですが、すべてパスしたコードです.