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

【JavaScript】2つの文字列を比較して追加された1文字を見つける方法

プログラミングでは、2つの文字列 st が与えられる問題によく出会います。ここで文字列 t は、文字列 s をランダムにシャッフルした後、ランダムな位置にさらに1文字を追加して生成されたものです。

この記事では、両方の文字列を受け取り、t に追加されたその1文字を返すJavaScript関数の実装方法を解説します。

問題の例

たとえば、入力される文字列が次の場合を考えてみましょう。

const s = "abcd", t = "abcde";

このとき、期待される出力は次のとおりです。

const output = "e";

これは、追加された文字が「e」であるためです。

解決策:XOR(排他的論理和)を使う方法

「同じ値同士でXOR演算を行うと0になる」という性質を利用すると、効率的に差分の文字を特定できます。以下が実際のコード例です。

const s = "abcd", t = "abcde";
const findTheDifference = (s, t) => {
    let a = 0, b = 0; let charCode, i = 0;
    while(s[i]){
        a ^= s.charCodeAt(i).toString(2);
        b ^= t.charCodeAt(i).toString(2);
        i++;
    };
    b^=t.charCodeAt(i).toString(2);
    charCode = parseInt(a^b,2);
    return String.fromCharCode(charCode);
};
console.log(findTheDifference(s, t));

コードの解説

  • charCodeAt() メソッドで各文字の文字コードを取得し、toString(2) で2進数の文字列に変換します。
  • s の各文字コードは変数 a に、t の各文字コードは変数 b にXOR演算で蓄積していきます。
  • ループ終了後、t の末尾にある余分な1文字も b に対してXOR演算で加えます。
  • 最後に a ^ b の結果を10進数に戻し、String.fromCharCode() で文字に変換して返します。

実行結果

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

e

別のアプローチ:文字コードの合計値の差で求める方法

XOR以外にも、各文字コードの合計値の差を利用する、より直感的な方法があります。

const findTheDifference = (s, t) => {
    let sum = 0;
    for (let i = 0; i < t.length; i++) {
        sum += t.charCodeAt(i);
    }
    for (let i = 0; i < s.length; i++) {
        sum -= s.charCodeAt(i);
    }
    return String.fromCharCode(sum);
};
console.log(findTheDifference("abcd", "abcde")); // "e"

t の全文字コードの合計から s の全文字コードの合計を引けば、その差が追加された1文字のコードになります。いずれの方法も計算量は O(n) であり、文字列の長さに比例した効率で処理できる点が魅力です。

  1. Day.jsを使って2つの時刻の差を求める方法【JavaScript】

    日付や時刻を扱う際、軽量で使いやすいJavaScriptライブラリ「Day.js」が便利です。この記事では、Day.jsを使って2つの時刻の差(時間数)を計算する方法を解説します。 時刻データの準備 まず、比較対象となる開始時刻と終了時刻をdayjs()で作成します。ここでは例として、開始時刻を10時、終了時刻を22時に設定します。 var startHour = dayjs().hour(10) var endHour = dayjs().hour(22) diff()メソッドで時刻の差を取得する 2つの時刻の差を求めるには、diff()メソッドを使用します。第1引数に比較対象のDay.js

  2. C#で2つのDateTimeオブジェクト間の差をミリ秒単位で求める方法

    C#では、TimeSpan構造体を使うことで、2つのDateTimeオブジェクト間の時間差を簡単に計算できます。この記事では、その差をミリ秒単位で取得する方法を解説します。基本的な手順まず、比較対象となる2つのDateTimeオブジェクトを用意します。以下は、同じ日付の時刻が異なる2つのオブジェクトの例です。DateTime date1 = new DateTime(2018, 8, 11, 08, 15, 20); DateTime date2 = new DateTime(2018, 8, 11, 11, 14, 25);次に、2つの日時の差を求めます。DateTime同士は減算演算子(-