JavaScriptで各要素より小さい数の個数を数えて配列を作成する方法
JavaScriptで、数値の配列を引数として受け取る関数を作成する必要があります。
この関数は、入力された配列をもとに新しい配列を構築します。新しい配列の各要素には、元の配列において「その要素よりも小さい値を持つ要素の個数」が格納されます。
処理のイメージ
例えば、入力配列が次のようになっているとします。
const arr = [2, 7, 3, 1, 56, 4, 7, 8];
この場合、出力される配列は次のようになります。
const output = [1, 4, 2, 0, 7, 3, 4, 6];
それぞれの値がどのように求められているか見てみましょう。
- 最初の要素 2:自分より小さいのは
1のみ → 1個 - 2番目の要素 7:自分より小さいのは 2, 3, 1, 4 の4つ(同じ値の7は含まない)→ 4個
- 5番目の要素 56:他のすべての要素より大きい → 7個
このように、重複する値は「自分自身」としては数えませんが、別の位置にある同じ値はカウント対象になります。
実装コード例
以下は二重ループを使ったシンプルな実装例です。
const arr = [2, 7, 3, 1, 56, 4, 7, 8];
const smallerThanCurrent = (arr = []) => {
let { length } = arr;
// 結果格納用の配列を0で初期化
let res = Array(length).fill(0);
// すべての要素同士を比較
for (let i = 0; i < length; i++) {
for (let j = 0; j < length; ++j) {
// 自分自身以外かつ、自分より小さい値ならカウント
if (i !== j && arr[i] > arr[j]) {
++res[i];
}
}
}
return res;
};
console.log(smallerThanCurrent(arr));
実行結果
コンソールには次のように出力されます。
[ 1, 4, 2, 0, 7, 3, 4, 6 ]
コードのポイント
Array(length).fill(0)を使うことで、入力配列と同じ長さの配列をすべて0で初期化できます。- 外側のループ変数
iが基準となる要素、内側のループ変数jが比較相手の要素です。 i !== jという条件により、自分自身との比較を除外しています。これがないと、値が等しい場合でも誤ってカウントされてしまう可能性があります。
計算量について
この実装では全要素同士を比較するため、時間計算量は O(n²) となります。配列のサイズが小さければ問題ありませんが、大量のデータを扱う場合は、配列をソートしてからインデックスを利用する方法など、O(n log n) で処理できる手法を検討するとよいでしょう。
-
【JavaScript】入力配列の各要素について「右側にある小さい要素の個数」を数えた配列を作成する方法
問題数値の配列を受け取り、それをもとに出力用の配列を構築する JavaScript の関数を作成することを考えます。出力配列の各要素には、入力配列の対応する要素よりも右側に存在し、かつその要素より小さい数値の個数を格納します。最後に、この配列を返します。例えば、[6, 2, 8, 5, 1, 3] という入力に対しては、以下のような出力が期待されます。6 の右側にある小さい数 → 2, 5, 1, 3 の 4 個2 の右側にある小さい数 → 1 の 1 個8 の右側にある小さい数 → 5, 1, 3 の 3 個5 の右側にある小さい数 → 1, 3 の 2 個1 の右側にある小さい数 → 0
-
JavaScriptで配列から三角形を作れる組み合わせの数を数える方法
問題 数値の配列 arr を第一引数(唯一の引数)として受け取る JavaScript 関数を作成します。 この関数の目的は、配列から選んだ3つの数値を三角形の3辺としたときに、実際に三角形が成立する組み合わせ(三つ組)の総数を数えることです。 たとえば、関数への入力が次のようだった場合: const arr = [2, 2, 3, 4]; 期待される出力は次のとおりです。 const output = 3; 出力の解説 有効な組み合わせは以下の3通りです。 2,3,4(1つ目の2を使用) 2,3,4(2つ目の2を使用) 2,2,3 三角形の成立条件 3つの辺 a、b、c(a ≤ b ≤ c