【JavaScript】異なるインデックスにある同じ値のペアを数える方法
問題の概要
整数の配列を第一引数(唯一の引数)として受け取るJavaScript関数を作成する必要があります。この関数の役割は、配列の中から「値が等しいが、インデックス(位置)が異なる」要素のペアの総数を数えて返すことです。
具体例を見てみましょう。入力配列が以下の場合:
const arr = [7, 9, 5, 7, 7, 5];
期待される出力は次のとおりです。
const output = 4;
これは、条件を満たすペアとして [7, 7] の組み合わせが3つ、[5, 5] の組み合わせが1つ存在し、合計4ペアとなるためです。
解決のアプローチ
最も効率的な方法は、ハッシュマップ(オブジェクト)を活用し、配列を一度だけ走査する方法です。
考え方はシンプルです。各要素に到達した時点で、「それ以前に出現した同じ値の個数」だけ新しいペアが成立します。そこで、走査中に現在の値の出現回数をカウントに加算していけば、すべてのペアを漏れなく数えられます。
この手法を使えば、二重ループによる O(n²) の素朴な実装と比べて、O(n) の時間計算量で高速に処理できるのが大きなメリットです。
コード例
以下が実際のコードです。
const arr = [7, 9, 5, 7, 7, 5];
const equalPairCount = (arr = []) => {
if(!arr?.length){
return 0;
};
const map = {};
let count = 0;
arr.forEach((val) => {
if (map[val]) {
count += map[val];
};
map[val] = map[val] + 1 || 1;
});
return count;
};
console.log(equalPairCount(arr));コードのポイント
- まず、空の配列が渡された場合に備えて早期リターンを行い、不要な処理を回避しています。
mapオブジェクトで、これまでに登場した各値の出現回数を管理します。- 要素を走査するたびに、同じ値が既に存在すれば、その出現回数分だけ新たなペアが成立するため、カウントに加算します。
- 最後に、現在の値の出現回数を1増やしてマップを更新します。
出力結果
コンソールには以下のように出力されます。
4
-
JavaScriptで複数の文字列に共通する文字を重複込みで抽出する方法
問題文字列の配列 arr を第一引数(かつ唯一の引数)として受け取るJavaScript関数を作成することを考えます。この関数の役割は、配列内のすべての文字列に出現する文字を抽出し、それらを配列として返すことです。重複も含めて扱う必要がある点に注意してください。たとえば、ある文字がすべての文字列の中で2回ずつ出現している場合(3回ではない場合)、最終的な結果にもその文字を2回だけ含めます。入力と出力の例たとえば、関数への入力が次のような場合を考えてみましょう。const arr = [door, floor, crook];r は3つの文字列すべてに1回ずつ現れ、o は door に2回、fl
-
JavaScriptでペアの最小値合計を最大化するアルゴリズムを解説
この記事では、整数の配列を受け取り、ペアごとの最小値の合計が最大になるようにグループ分けするJavaScript関数の実装方法を解説します。 問題の概要 長さ2nの整数配列 arr を引数として受け取るJavaScript関数を作成します。この関数の目的は、配列内の整数をn個のペア (a1, b1), (a2, b2), ..., (an, bn) にグループ化し、各ペアの最小値 min(ai, bi) の合計(i = 1 から n まで)ができるだけ大きくなるようにすることです。 例えば、次の入力が与えられたとします。 const arr = [1, 4, 3, 2]; この場合、期待される