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

【JavaScript】2つの配列間の文字列の長さにおける最大絶対差を求める方法


問題

2つの文字列の配列 a1a2 を引数として受け取るJavaScript関数を作成する必要があります。各文字列は a〜z の英字のみで構成されているものとします。ここで x を1つ目の配列内の任意の文字列、y を2つ目の配列内の任意の文字列としたとき、関数は次の値を求めます。

max(abs(length(x) − length(y)))

つまり、別々の配列に属する文字列のペアごとに長さの差の絶対値を計算し、その中で最大となる値を返すという問題です。

解法のポイント

すべての文字列の組み合わせに対して二重ループで差を求めることも可能ですが、より効率的なアプローチがあります。絶対差が最大になるのは、必ず「片方の配列の最長文字列」と「もう片方の配列の最短文字列」の組み合わせであるため、各配列の文字列長の最大値と最小値さえ分かれば計算できます。

具体的には、Math.max(配列1の最大長 − 配列2の最小長, 配列2の最大長 − 配列1の最小長) を返すだけでよく、O(n) の計算量で結果を導き出せます。また、どちらかの配列が空の場合は比較が不可能なため、-1 を返す仕様とします。

コード例

以下が実際のコードです。

const arr1 = ["hoqq", "bbllkw", "oox", "ejjuyyy", "plmiis", "xxxzgpsssa", "xxwwkktt", "znnnnfqknaz", "qqquuhii", "dvvvwz"];
const arr2 = ["cccooommaaqqoxii", "gggqaffhhh", "tttoowwwmmww"];
const findMaxAbsDiff = (arr1 = [], arr2 = []) => {
    if(arr1.length === 0 || arr2.length === 0){
        return -1;
    };
    let l1 = arr1.map(str => str.length)
    let l2 = arr2.map(str => str.length)
    return Math
    .max(Math.max(...l1) - Math.min(...l2), Math.max(...l2) - Math.min(...l1));
};
console.log(findMaxAbsDiff(arr1, arr2));

出力

13

処理の流れの解説

  • まず、どちらかの配列が空であれば -1 を返して処理を終了します。
  • map() を使って、各配列の文字列を文字数(数値)の配列へ変換します。
  • スプレッド構文 ...Math.maxMath.min に値を渡し、両方向の差を比較します。これにより abs() を明示的に呼び出さなくても最大絶対差が求まります。
  • この例では、arr2 の最長文字列「cccooommaaqqoxii」(16文字)と arr1 の最短文字列「oox」(3文字)の差が 13 となり、これが最大値となります。
  1. JavaScriptで2つの配列から共通する最長シーケンスを見つける方法

    問題の概要リテラル値を要素とする2つの配列(arr1 と arr2)を受け取る JavaScript 関数を作成する必要があります。この関数は、両方の配列に共通して現れる最長の要素列(ストリーク)を見つけ出し、その要素を新しい配列として返します。共通する要素が存在しない場合は空文字列を含む配列が返されます。入力例const arr1 = [a, b, c, d, e]; const arr2 = [k, j, b, c, d, w];この場合、両方の配列に「b」「c」「d」がこの順序で共通して現れているため、期待される出力は以下のようになります。出力例const output = [b, c,

  2. JavaScriptで2つの配列から作れる最大の数を求める方法

    問題1桁の数字を要素とする2つの配列 arr1 と arr2 を第1・第2引数として受け取り、さらに数値 num(num <= arr1.length + arr2.length)を第3引数として受け取るJavaScript関数を作成します。この関数が返すのは、長さ num の1桁の数字からなる新しい配列です。この配列自体が1つの数値を表しており、その値は両方の配列の要素を組み合わせて作成できる最大の数でなければなりません。ただし、重要な条件がひとつあります。それは、同じ配列内の要素の相対的な順序は維持しなければならないという点です。例えば、関数への入力が次の場合を考えてみましょう。co