JavaScriptで1回と2回だけ出現する2つの数値を見つける方法
問題
JavaScriptで次のような関数を実装することを考えます。引数として配列を受け取り、その配列内ではほとんどの数値が3回ずつ出現している一方で、ある1つの数値だけが2回、そしてもう1つの数値だけが1回しか出現していません。この関数の役割は、それら2つの特別な数値を見つけ出して返すことです。
コード例
以下がその実装コードです。
const arr = [1, 1, 1, 2, 2, 3];
const findMissing = (arr = []) => {
let x = 0;
let y = 0;
for(let i = 0; i < arr.length; i++){
if(arr.filter(a => a === arr[i]).length === 2){
y = arr[i];
};
if(arr.filter(b => b === arr[i]).length === 1){
x = arr[i];
};
};
return [x, y];
};
console.log(findMissing(arr));
コードの解説
このコードでは、配列の各要素について filter() メソッドを使って同じ値の出現回数を数えています。出現回数が2回であれば変数 y に、1回であれば変数 x に代入し、最終的に [x, y] の形式で両方の数値を返します。
なお、このアプローチは各要素ごとに filter() を呼び出すため、計算量はO(n²)となります。配列が大きくなるとパフォーマンスが低下するため、実際の開発では Map オブジェクトなどを使って各数値の出現回数を一度に集計し、計算量をO(n)に抑える方法が推奨されます。
出力
コンソールには以下のように出力されます。最初の要素「3」が1回だけ出現した数値、次の要素「2」が2回出現した数値です。
[3, 2]
-
JavaScriptで2つの文字列に共通しない文字を抽出して返す方法
問題2つの文字列を引数として受け取るJavaScript関数を作成することを考えます。この関数は、両方の文字列に共通して含まれていない文字、つまりどちらか一方の文字列にのみ存在する文字だけを抜き出し、それらをつなげた新しい文字列を返す必要があります。たとえば、xyab と xzca の2つの文字列が与えられた場合、共通する文字は x と a なので、結果として y、b、z、c を連結した ybzc を返すことになります。コード例以下がその実装コードです。const str1 = xyab; const str2 = xzca; const findUncommon = (str1 = , s
-
JavaScriptで合計と最大公約数(GCD)から元の2つの数値を求める方法
問題2つの引数を受け取るJavaScript関数を作成する必要があります。1つ目の引数はある2つの数値の合計(sum)を、2つ目の引数はその2つの数値の最大公約数(GCD:HCF)を表します。関数の目的は、これらの条件を満たす元の2つの数値を見つけ出し、配列として返すことです。考え方(アプローチ)2つの数値の最大公約数が gcd であるとき、その2つの数値はどちらも必ず gcd の倍数になります。したがって、合計も必ず gcd の倍数でなければなりません。この性質を使うと、処理は次のようにシンプルにまとめられます。sum % gcd !== 0 の場合(合計がGCDで割り切れない場合)、条件を