[アルゴリズム]2 Dナビゲーション-等高線



等号を求める


N(1<=N<=100)名の生徒の国語点数を入力する場合は、入力順に生徒毎の点数を出力するプログラムを作成します.
■説明の入力
1行目はN(3<=N<=1000)、2行目はN個の国語の点数を表す整数を入力します.同じ点数を入力すると、高い点数で同じ処理を行います.すなわち、最高点数は92点で、3位92点があれば、1位は3位で、次いで4位だった.
■出力説明
入力した順に等号を出力します.
■入力例1
5
87 89 92 100 76
■出力例1
4 3 2 1 5

説明する

function solution(arr) {
  let answer = [];
  let sortedArr = [...arr].sort((a, b) => b - a);
  arr.forEach((item) => answer.push(sortedArr.indexOf(item) + 1));
  return answer;
}
実は時間がかかった問題ですどうやって解けばいいのか、もう予感がした.降順で並べ替えた後、並べ替えた配列の中で伝達された配列の中の項目を1つずつ検索し、インデックスがどれだけあるかを見つけ、正しい配列で腕立て伏せを行います.でもうろうろしている部分はどこなのか、
let sortedArr = arr.sort((a, b) => b - a);
この部分です.スプレッドシート演算子は使用されず、アレイsortでソートされ、結果は望ましくありません.いったい何が問題なのか.現在のsortedArrがコンソールに表示されている場合、電子演算子を使用するか使用しないかは同じです.
JavaScriptが配列を新しい変数に割り当てる場合、新しい配列は既存の配列を参照します.したがって、新しいアレイを変更すると、元のアレイも変更されます.したがって、arrを並べ替える場合、forEach関数が呼び出され、得られる結果は異なる.

上はスプレッドシート演算子sortを用いたarr状態であり,次は配列を直接新しい変数に割り当てた状態である.下が整列していることがわかります.
したがって、sortメソッドは元のアレイを変更するので、元のアレイを電子演算子として浅い複製を行うアレイsortが正しい!

講師の説明

function solution(arr){  
  let n=arr.length;
  let answer=Array.from({length:n}, ()=>1);
  for(let i=0; i<n; i++){
    for(let j=0; j<n; j++){
      if(arr[j]>arr[i]) answer[i]++;
    }
  }             
  return answer;
}
これは最も一般的な2つの解題方法です.