JavaScriptで配列内の唯一の異なる文字列を見つける方法
問題
文字列の配列を受け取るJavaScript関数を作成する必要があります。配列内のすべての文字列は同じ文字(またはその並べ替え)で構成されていますが、ただ1つの文字列だけが異なる文字セットを含んでいます。この関数の目的は、その唯一の文字列を見つけ出して返すことです。
例:
次のような配列が与えられたとします。
['ba', 'abc', 'acb', 'bac', 'foo', 'bca', 'cab', 'cba']
この場合、求めるべき文字列は「foo」です。
文字列には空白が含まれることがありますが、空白自体は意味を持たず、空白以外の記号のみが判定の対象となります。たとえば、空白だけで構成された文字列は空文字列と同等に扱います。なお、配列には必ず3つ以上の文字列が含まれることが保証されています。
解決コード
以下はこの問題を解くためのコード例です。
const arr = ['ba', 'abc', 'acb', 'bac', 'foo', 'bca', 'cab', 'cba'];
const findOnlyUnique = (arr = []) => {
const first = [];
for(i = 0; i < arr.length; i++){
first.push(arr[i].toLowerCase().replace(/\s/g, '').split(''));
for (j = 0; j < arr[i].length; j++){
first[i].sort();
}
}
const second = [];
for (k = 0; k < arr.length; k++){
second.push(first[k].join());
}
second.sort();
const third = [];
if (second[1] !== second[second.length - 1]) {
third.push(second[second.length - 1]);
}else{
third.push(second[0]);
}
const last = [];
for(let n = 0; n < first.length; n++){
last.push(first[n].join(','));
}
return (arr[last.indexOf(third[0])]);
};
console.log(findOnlyUnique(arr));
出力結果
foo
コードの解説
この関数の処理の流れを順番に見ていきましょう。
- 正規化: 各文字列を小文字に変換し、正規表現
/\s/gを使って空白をすべて除去します。その後、split('')で1文字ずつ配列に分解します。 - ソート: 文字の配列をソートすることで、元の並び順に関係なく、同じ文字セットを持つ文字列はすべて同一の形式に変換されます。
- 比較用の文字列生成:
join()メソッドでソート済みの文字配列を連結し、比較可能な文字列を作成します。 - 異常値の特定: 正規化した文字列をさらにソートすると、同じ文字セットを持つ要素は互いに隣り合い、唯一の異なる文字列は配列の先頭か末尾に現れます。
second[1]と末尾の要素を比較することで、どちらが異常値かを判定できます。 - 元の文字列の返却: 最後に、判定した文字列と一致するインデックスを元の配列から探し、対応する元の文字列を返します。
このアプローチにより、文字の並び順が異なるアナグラム同士を正しく同一視しながら、唯一の異なる文字列を効率的に特定することができます。
-
JavaScriptで配列要素をそのインデックスでべき乗した値に変換する方法
問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、入力配列の各要素を、その要素の位置を示す0始まりのインデックスでべき乗し、新しい配列へと変換します。そして最終的に、この新しい配列を返します。 例えば、インデックス0にある要素は0乗(常に1)、インデックス3にある要素は3乗、というように各要素が処理されます。 実装のポイント ループで配列を走査しながら、各要素とそのインデックスを同時に取得する Math.pow() を使って「要素 ^ インデックス」を計算する 計算結果を結果配列の同じ位置に格納する なお、モダンなJavaScriptでは Math
-
【JavaScript】配列内で最も頻出する単語を上位N件抽出する方法
問題概要英小文字のみで構成された文字列の配列 arr を第一引数として受け取り、数値 num(num は配列の長さより小さい値)を第二引数として受け取る JavaScript 関数を作成します。この関数は、配列 arr 内で最も頻出する要素を上位 num 件返す必要があります。結果は出現回数が多い順に並べます。また、出現回数が同じ単語が複数ある場合は、辞書順(アルファベット順)で先に来る単語を優先して並べます。入力例const arr = [the, day, is, sunny, the, the, the, sunny, is, is]; const num = 4;出力例const ou