[programmers]Kビット数


問題の説明


配列のi番からj番までを切り取って並べ替えると、k番目の数字を求めようとします.
例えばarrayが[1,5,2,6,3,7,4],i=2,j=5,k=3の場合
  • 配列の2番目から5番目の場合は[5,2,6,3]である.
  • 1の配列を並べ替えると[2,3,5,6].
  • 2の配列の3番目の数字は5です.
  • 配列配列、[i、j、k]を要素とする2次元配列コマンドをパラメータとして与える場合は、commandsのすべての要素に前述の演算を適用した結果を配列に戻してsolution関数を作成します.

    せいげんじょうけん

  • arrayの長さは100を超えない.
  • arrayの各要素は1または100未満です.
  • コマンドの長さは50を超えません.
  • コマンドの各要素の長さは3です.
  • I/O例


    arraycommandsreturn[1, 5, 2, 6, 3, 7, 4][[2, 5, 3], [4, 4, 1], [1, 7, 3]][5, 6, 3]

    I/O例説明


    [1,5,2,6,3,7,4]を2番目から5番目に切り取り、並べ替えます.[2,3,5,6]の3番目の数字は5です.
    [1,5,2,6,3,7,4]を4番目から4番目に切り取り、並べ替えます.[6]の最初の数字は6である.
    [1,5,2,6,3,7,4]最初から7番目にカット[1.2.3.4.5.6.7]の3番目の数字は3です.

    に答える


  • これは、コマンドの開始インデックスと終了インデックスを値配列から分離し、ソートしてk個の数字を見つけ、配列に入れて返す問題です.

  • 対応するサイズの最終値配列を生成し、元の配列から値をコピーしてソートします.

  • 「最終値配列」にk番目の値に対応する値を入力します.

  • そろったら返す.
  • コード#コード#

    class Solution {
        public int[] solution(int[] array, int[][] commands) {
            int[] answer = new int[commands.length];
            int[] temp;
            int index;
    
            for (int i = 0; i < commands.length; i++) {
                index = 0;
                temp = new int[commands[i][1] - commands[i][0] + 1];
                for (int j = commands[i][0] - 1; j <= commands[i][1] - 1; j++)
                    temp[index++] = array[j];
                Arrays.sort(temp);
                answer[i] = temp[commands[i][2] - 1];
            }
    
            return answer;
        }
    }
    次のArrays.copyOfRange()を使用すると、同じ機能でより簡単なコードを記述することができます.

    📌 Arrays.copyOfRange()


  • copyOfRange(arr,n 1,n 2):伝達された配列の特定の範囲に対応する要素のみを新しい配列にコピーして返します.

  • 放射線の対象となる첫 번째 매개변수(arr)を원본 배열で伝達する.
  • 두 번째 매개변수は、元の配列からコピーされた시작 인덱스を受信し、3番目のパラメータは마지막으로 복사될 배열 요소의 바로 다음 인덱스である.

  • すなわち、세 번째 매개변수に渡されるインデックスの前の配列要素にのみコピーされる.次に、元のアレイと同じタイプのコピーされた新しいアレイを返します.( ソース )
  •     public static int[] solution(int[] array, int[][] commands) {
            int[] answer = new int[commands.length];
            
            for (int i = 0; i < commands.length; i++) {
                int[] temp = Arrays.copyOfRange(array, commands[i][0] - 1, commands[i][1]);
                Arrays.sort(temp);
                answer[i] = temp[commands[i][2] - 1];
            }
            
            return answer;
        }