JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

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]
  1. JavaScriptで2つの文字列に共通しない文字を抽出して返す方法

    問題2つの文字列を引数として受け取るJavaScript関数を作成することを考えます。この関数は、両方の文字列に共通して含まれていない文字、つまりどちらか一方の文字列にのみ存在する文字だけを抜き出し、それらをつなげた新しい文字列を返す必要があります。たとえば、xyab と xzca の2つの文字列が与えられた場合、共通する文字は x と a なので、結果として y、b、z、c を連結した ybzc を返すことになります。コード例以下がその実装コードです。const str1 = xyab; const str2 = xzca; const findUncommon = (str1 = , s

  2. JavaScriptで合計と最大公約数(GCD)から元の2つの数値を求める方法

    問題2つの引数を受け取るJavaScript関数を作成する必要があります。1つ目の引数はある2つの数値の合計(sum)を、2つ目の引数はその2つの数値の最大公約数(GCD:HCF)を表します。関数の目的は、これらの条件を満たす元の2つの数値を見つけ出し、配列として返すことです。考え方(アプローチ)2つの数値の最大公約数が gcd であるとき、その2つの数値はどちらも必ず gcd の倍数になります。したがって、合計も必ず gcd の倍数でなければなりません。この性質を使うと、処理は次のようにシンプルにまとめられます。sum % gcd !== 0 の場合(合計がGCDで割り切れない場合)、条件を