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

JavaScriptで文字列のシフト操作を効率的に実行する方法

問題の概要

小文字の英字で構成される文字列 str と、配列の配列 arr が与えられているとします。ここで arr[i] = [direction, amount] の形式でシフト操作が表されます。

  • direction は 0(左シフト)または 1(右シフト)を表します。

  • amount は文字列をシフトする回数です。

  • 1回の左シフトとは、文字列の先頭の文字を取り除いて末尾に追加することを意味します。

  • 同様に、1回の右シフトとは、文字列の末尾の文字を取り除いて先頭に追加することを意味します。

ここで求められているのは、文字列を第1引数として、シフト操作のデータを含む配列を第2引数として受け取るJavaScript関数を作成することです。

この関数は配列を反復処理しながら文字列に対して必要なシフト操作を実行し、最終的に新しい文字列を返します。

入力例と期待される出力

例として、入力文字列と配列が以下の場合を考えてみましょう。

const str = 'abc';
const arr = [[0, 1], [1, 2]];

このとき、期待される出力は以下の通りです。

const output = 'cab';

その理由は以下の通りです。

  • [0,1] は1回の左シフトを意味します。「abc」→「bca」

  • [1,2] は2回の右シフトを意味します。「bca」→「cab」

実装例

この問題を解くコードは以下の通りです。

const str = 'abc';
const arr = [[0, 1], [1, 2]];
const performShifts = (str = '', arr = []) => {
    if(str.length < 2){
        return str;
    };
    let right = 0
    let left = 0;
    for(let sub of arr){
        if(sub[0] == 0){
            left += sub[1];
        }else{
            right += sub[1];
        };
    };
    if(right === left){
        return str;
    }
    if(right > left){
        right = right - left;
        right = right % str.length;
        return str.substring(str.length - right) + str.substring(0, str.length - right);
    }else{
        left = left - right;
        left = left % str.length;
        return str.substring(left) + str.substring(0, left);
    };
};
console.log(performShifts(str, arr));

出力

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

cab

コードの解説

この実装のポイントは、各シフト操作を一つずつ文字列に適用するのではなく、左シフトと右シフトの合計回数をそれぞれ集計し、その差分だけを一度に処理している点です。これにより、シフトの指示が何件あっても効率よく計算できます。

また、シフト量が文字列の長さを超える場合は、文字列の長さで剰余を取ることで無駄な回転を排除しています。さらに、左シフトと右シフトの回数が等しい場合、文字列は元の状態に戻るため、そのままの文字列を返すという最適化も行われています。

文字列の切り出しには substring() メソッドを使用し、右シフトの場合は末尾部分を先頭に、左シフトの場合は先頭部分を除いた残りを並べ替えることで、目的の回転結果を実現しています。

  1. JavaScriptで循環するアルファベット文字列に含まれる一意な部分文字列を数える方法

    問題概要文字列 abcdefghijklmnopqrstuvwxyz を無限に繰り返してできる循環文字列 S を考えてみましょう。このとき、S は次のような形になります。...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd.....今回実装するのは、引数として文字列 str を1つだけ受け取る JavaScript 関数です。この関数は以下の処理を行います。str の空でない部分文字列のうち、S に含まれるものをすべて洗い出す。S 内に存在する str の異なる非空部分文字列の個数を最終的な結果として返す。たとえば、関数への入

  2. JavaScriptで不正な時間文字列(HH:MM:SS)を正規化して修正する方法

    JavaScriptでは、「HH:MM:SS」形式の時間文字列を扱う場面がよくあります。しかし、時間の加算処理などで計算ミスが発生すると、分や秒が60を超えてしまう「壊れた」時間文字列が生成されることがあります。この記事では、そうした不正な時間文字列を正しく正規化する方法を解説します。 課題:壊れた時間文字列とは 今回求められるのは、JavaScriptで「HH:MM:SS」形式の時間文字列を受け取り、必要な修正を加えた上で、正しい時間文字列として返す関数を作成することです。 問題になるのは、加算処理のバグによって、次のような不正な値が含まれてしまうケースです。 MM(分)の部分が60を超え