JavaScriptで文字列から欠落している文字を見つける方法
文字列の長さが m で、その中に英アルファベットの最初の m 文字が含まれているとします。しかし何らかの理由で、そのうちの 1 文字が文字列から欠落してしまい、実際には m-1 文字しか含まれていない状態になっています。
このような文字列を引数として受け取り、欠落している 1 文字を返す関数を JavaScript で作成していきましょう。
実装のアプローチ
この問題は、アルファベットの各文字(a 〜 z に対応する文字コード 97 〜 122)を順番にチェックし、文字列に含まれていない最初の文字を見つけることで解決できます。
具体的には、以下の手順で処理を行います。
- 関数の一貫性を高めるため、受け取った文字列をすべて小文字に変換します。
- 文字コード 97('a')から順にループ処理を行います。
- 各文字コードを
String.fromCharCode()で文字に変換し、文字列に含まれているかどうかをincludes()で判定します。 - 含まれていなければ、その文字が欠落している文字なので、それを返して処理を終了します。
コード例
実際のコードは以下のようになります。
const str = "acdghfbekj";
const missingCharacter = str => {
// 関数の一貫性を高めるため小文字に変換
const s = str.toLowerCase();
for(let i = 97; ; i++){
if(s.includes(String.fromCharCode(i))){
continue;
};
return String.fromCharCode(i);
};
return false;
};
console.log(missingCharacter(str));出力結果
コンソールに出力される結果は以下のとおりです。
i
この例では、入力文字列 "acdghfbekj" には a から k までの 11 文字のうち 10 文字が含まれており、欠落しているのは「i」であるため、正しく「i」が出力されます。
補足
このアプローチはシンプルで直感的ですが、includes() を文字ごとに呼び出すため、最悪の場合の計算量は O(m²) になります。文字列が長くなる場合は、Set を使って文字の存在判定を O(1) にすることで、全体の計算量を O(m) に改善できます。
-
JavaScriptで文字列の先頭と末尾から「?」を削除する方法
本記事では、文字列を唯一の引数として受け取り、その先頭と末尾に含まれる「?」(半角クエスチョンマーク)だけを削除するJavaScript関数の作成方法を解説します。文字列の途中にある「?」はそのまま保持し、両端のみをトリミングするのがポイントです。要件の確認求められる動作は以下のとおりです。引数として渡された文字列の先頭・末尾に連続して並ぶ「?」をすべて除去する文字列内部(中間)に存在する「?」は削除しないそれ以外の文字は一切変更しない入出力の例たとえば、入力文字列が次の場合:const str = ??this is a ? string?;期待される出力は以下になります。const out
-
JavaScriptで2つの文字列から作れる重複なしの最長文字列を求める方法
問題今回は、「a」から「z」までの英小文字のみを含む2つの文字列 s1 と s2 を引数として受け取る JavaScript の関数を作成します。この関数が返すべきのは、s1 または s2 に登場する文字をすべて集め、重複を排除したうえで昇順に並べ替えた、可能な限り長い文字列です。各文字は1回だけ出現し、結果は必ずソートされた状態でなければなりません。たとえば、ある文字が両方の文字列に現れたとしても、結果には1度だけ含める必要があります。解決のアプローチ実装の手順は以下の通りです。1. concat() を使って2つの文字列を連結します。2. toLowerCase() で全体を小文字に統一し