【JavaScript】配列から奇数回出現する要素を削除する方法を実装で解説
JavaScriptで配列を操作していると、「同じ値が奇数回出現する場合に、その最後の出現だけを取り除きたい」という要件に出会うことがあります。本記事では、そのような処理をハッシュマップ(連想オブジェクト)を活用して効率的に実装する方法を解説します。
問題の定義
まず、次のような数値の配列を考えてみましょう。
const arr = [1, 6, 3, 1, 3, 1, 6, 3];
この配列に対して、奇数回出現する数値(ただし1回だけしか出現しない要素は除外)を見つけ出し、その最後の出現箇所を削除する関数を作成します。
期待される結果
上記の配列では、数値「1」と「3」がそれぞれ3回(奇数回)出現しています。一方、数値「6」は2回(偶数回)出現しているため対象外です。
したがって、「1」と「3」の3回目の出現を削除すると、結果は次のようになります。
const output = [1, 6, 3, 1, 3, 6];
実装のアプローチ
この問題を解くための基本的な流れは以下の通りです。
- ハッシュマップを用意し、各数値について出現回数と最後に出現したインデックスを記録します。
- マップを走査し、出現回数が奇数かつ1回より多い数値を特定します。
- 該当する数値の最後の出現位置をコピー配列から削除します。
マップの各キーには配列を値として格納し、第1要素に出現回数、第2要素に最後の出現インデックスを持たせるのがポイントです。こうすることで、配列を一度走査するだけで必要な情報をすべて収集できます。
サンプルコード
const arr = [1, 6, 3, 1, 3, 1, 6, 3];
const removeOddOccurence = (arr = []) => {
// 元の配列は変更せず、コピーを操作する
const copy = arr.slice();
const map = {};
// 各数値の出現回数と最後のインデックスを記録
arr.forEach((num, ind) => {
if (map.hasOwnProperty(num)) {
map[num][0]++;
map[num][1] = ind;
} else {
map[num] = [1, ind];
}
});
// 奇数回出現した数値(1回のみは除外)の最後の出現を削除
for (const key in map) {
const [freq, index] = map[key];
if (freq !== 1 && freq % 2 === 1) {
copy.splice(index, 1, '');
}
}
// 削除用マーカー(空文字)を除外して返す
return copy.filter(el => el !== '');
};
console.log(removeOddOccurence(arr));コードのポイント解説
- 元の配列を保護:
arr.slice()でコピーを作成することで、引数として渡された元の配列が破壊的に変更されるのを防いでいます。 - spliceの活用:
copy.splice(index, 1, '')により、該当インデックスの要素を空文字に置き換えています。直接削除するとインデックスがずれてしまうため、先にマーキングしておくのが安全です。 - filterで仕上げ: 最後に
filter()で空文字を除去し、目的の配列を完成させています。 - 条件の判定:
freq !== 1 && freq % 2 === 1という条件により、「1回だけの出現」は残しつつ、「3回以上の奇数回出現」のみを削除対象としています。
実行結果
コンソールには次のように出力されます。
[1, 6, 3, 1, 3, 6]
このように、ハッシュマップで出現情報を事前に集計しておけば、時間計算量O(n)で効率的に処理できます。配列の中から特定の出現パターンを持つ要素を操作したい場合の参考にしてみてください。
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実
-
JavaScriptの配列から奇偶が異なる唯一の要素を返す方法
問題の概要整数の配列 arr を第1引数(かつ唯一の引数)として受け取るJavaScript関数を作成します。この配列には、「すべて偶数+奇数が1個だけ」または「すべて奇数+偶数が1個だけ」という特徴があります。関数の役割は、その中で唯一ほかと性質が異なる要素を見つけ出し、それを返すことです。たとえば、次のような入力が与えられた場合を考えてみましょう。入力const arr = [5, 9, 7, 11, 34, 23, 77];出力const output = 34;出力の解説この配列はほぼすべて奇数で構成されていますが、34 だけが偶数です。したがって、返すべき値は 34 となります。実装