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

【JavaScript】文字列を左・右に循環シフトする関数の実装方法

JavaScriptでは、文字列2つの数値(m と n)を受け取る関数が必要になることがあります。ここで m は左シフトの回数、n は右シフトの回数を表します。

左シフトとは

左シフトとは、文字列を1回循環回転させる操作で、先頭の文字が末尾に移動し、それ以外のすべての文字が1つずつ左へずれます。

例えば、abcde は1回の左シフトで bcdea になり、2回の左シフトで cdeab になります。

右シフトとは

右シフトとは、その逆の操作です。末尾の文字が先頭に移動し、残りのすべての文字が1つずつ右へずれます。

例えば、abcde は1回の右シフトで eabcd になり、2回の右シフトで deabc になります。

つまり今回作成する関数は、指定された回数だけ左シフトと右シフトを実行し、最終的に結果となる文字列を返す必要があります。

実装コード

以下のコードは、ヘルパー関数 shiftByAmount() を使って、左シフトと右シフトを両方処理できるようにしたものです。負の値を渡すと右シフト、正の値を渡すと左シフトとして動作します。

const str = 'abcdef';

// ヘルパー関数
// 正の値は左シフト、負の値は右シフトとして扱う
const shiftByAmount = (str, leftShifts) => {
    leftShifts = leftShifts % str.length;
    return str.slice(leftShifts) + str.slice(0, leftShifts);
};

const getShiftedString = (str, leftShifts, rightShifts) =>
    shiftByAmount(shiftByAmount(str, leftShifts), -rightShifts);

console.log(getShiftedString(str, 3, 2));

コードの解説

  • shiftByAmount() では、剰余演算子(%)を使ってシフト回数を文字列の長さの範囲内に正規化しています。これにより、文字列の長さより多い回数が指定されても正しく動作します。
  • JavaScriptの剰余演算は負の数に対して負の結果を返すため、-rightShifts を渡すことで slice() の挙動により自然に右方向への回転が実現できます。
  • getShiftedString() は、まず左シフトを適用し、その結果に右シフト(-rightShifts)を適用することで、両方の操作を一度に行っています。

出力結果

コンソールには次のように出力されます。

bcdefa

'abcdef' を3回左シフトすると 'defabc' となり、さらに2回右シフトすることで最終的に 'bcdefa' が得られます。

  1. JavaScriptで正規表現をテスト・実行する方法|test()とexec()の使い方

    JavaScriptでは、RegExpオブジェクトを使って正規表現を扱います。パターンが文字列にマッチするかどうかを確認するには test() メソッドを、実際にマッチした結果を取得するには exec() メソッドを使用します。この記事では、両者の違いと具体的な使い方をサンプルコード付きで解説します。 test()メソッドとexec()メソッドの違い test()メソッド: 正規表現パターンが文字列にマッチすれば true、マッチしなければ false を返すシンプルな真偽判定用メソッドです。 exec()メソッド: マッチした場合、マッチした部分文字列などを含む結果の配列を返します。マッチ

  2. C#の左シフト演算子(<<)と右シフト演算子(>>)の使い方を解説

    C#には、ビット単位でデータを操作するための「シフト演算子」が用意されています。代表的なものが左シフト演算子(<<)と右シフト演算子(>>)です。この記事では、それぞれの仕組みと具体的な使い方をサンプルコードとともに解説します。 左シフト演算子(<<)とは 左シフト演算子は、左側のオペランドの値を、右側のオペランドが指定したビット数だけ左に移動させる演算子です。 ビットが左にずれると、空いた下位ビットには0が埋められます。2進数では1桁左にずれるごとに値が2倍になるため、左シフトは「2のn乗倍」の計算としても利用できます。 右シフト演算子(>>)