JavaScriptで配列を回転させる方法:追加メモリ不要の実装テクニック
JavaScriptで、配列と数値 n を受け取る関数を作成することを考えます。
この関数は、配列を n 個ぶんだけ回転させるものです。つまり、先頭から n 個の要素を取り出し、それらを配列の末尾へ移動します。
ただし、ここで求められる唯一の条件は、余分なメモリ領域を使用しないことです。
具体例
たとえば、入力配列が次のようになっているとします。
const arr = [12, 6, 43, 5, 7, 2, 5];
ここで n が 3 の場合、期待される出力は次のとおりです。
const output = [5, 7, 2, 5, 12, 6, 43];
先頭の「12」「6」「43」の3要素が末尾へ移動し、残りの要素が前に詰められているのがわかります。
実装コード
以下が実際のコード例です。
const arr = [12, 6, 43, 5, 7, 2, 5];
const num = 5;
const rotateByOne = arr => {
for(let i = 0; i < arr.length-1; i++){
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
};
}
Array.prototype.rotateBy = function(n){
const { length: l } = this;
if(n >= l){
return;
};
for(let i = 0; i < n; i++){
rotateByOne(this);
};
};
arr.rotateBy(num);
console.log(arr);出力結果
コンソールには次のように表示されます。
[
2, 5, 12, 6,
43, 5, 7
]コードの解説
このアプローチの中心となるのは rotateByOne 関数です。この関数は、隣接する2つの要素を順番に入れ替えていくことで、配列全体を1つぶん左へシフトします。
続いて、Array.prototype.rotateBy メソッドを定義しています。このメソッドは、指定された回数 n だけ rotateByOne を呼び出すことで、n 要素ぶんの回転を実現します。また、n が配列の長さ以上の場合は回転しても元と同じ並びになるため、何もせずに処理を終了するガードが入っています。
隣接要素のスワップだけで完結するため、新しい配列や一時的なバッファは一切不要です。そのため空間計算量は O(1) となり、「追加メモリを使わない」という条件を満たしています。
一方で注意点もあります。1要素の回転に配列全体を走査するため、時間計算量は O(n × l)(l は配列の長さ)になります。大きな配列を大量に回転させるケースでは、パフォーマンスへの影響を考慮しておくとよいでしょう。
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実
-
【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