JavaScriptで文字列内の母音だけを反転する方法
問題の概要
文字列を引数として受け取り、その中に含まれる母音(a・e・i・o・u)だけを反転するJavaScript関数を作成する必要があります。子音やその他の文字は元の位置にそのまま残し、母音同士の位置のみを入れ替えるのがポイントです。
入力と出力の例
たとえば、次の文字列が入力された場合を考えてみましょう。
const str = 'Hello';
この文字列に含まれる母音は「e」と「o」です。この2つを入れ替えると、期待される出力は次のようになります。
const output = 'Holle';
実装コード
この問題は「両端ポインタ(two-pointer)方式」を使うことで効率的に解けます。文字列の左端と右端から同時に走査を始め、両側で母音が見つかった時点でそれらを入れ替えていくというアプローチです。
const str = 'Hello';
const reverseVowels = (str = '') => {
const vowels = new Set(['a','e','i','o','u','A','E','I','O','U']);
let left = 0, right = str.length - 1;
let foundLeft = false, foundRight = false;
str = str.split("");
while(left < right){
if(vowels.has(str[left])){
foundLeft = true;
};
if(vowels.has(str[right])){
foundRight = true;
};
if(foundLeft && foundRight){
[str[left], str[right]] = [str[right], str[left]];
foundLeft = false;
foundRight = false;
};
if(!foundLeft) {
left++;
};
if(!foundRight) {
right--;
};
};
return str.join("");
};
console.log(reverseVowels(str));コードの解説
- vowelsセット:大文字・小文字すべての母音をSetに格納することで、各文字が母音かどうかをO(1)の計算量で判定できます。
- left / rightポインタ:文字列の先頭と末尾から中央に向かって移動していきます。
- foundLeft / foundRightフラグ:左右それぞれで母音が見つかったかどうかを記録するための真偽値です。
- 入れ替え処理:両側で母音が見つかったタイミングで、分割代入構文を使って2つの文字の位置を交換します。
なお、文字列は直接インデックスで要素を変更できないため、最初にsplit("")で配列化し、処理完了後にjoin("")で再び文字列へ戻している点にも注目してください。
実行結果
上記のコードを実行すると、コンソールには次のように出力されます。
Holle
-
JavaScriptで文字列内の単語を逆順に並べ替える方法
問題文(センテンス)を表す文字列を受け取り、その中に含まれる単語の順序を逆にして、新しい文字列として返すJavaScript関数を作成する必要があります。つまり、最後の単語が最初に、最後から2番目の単語が2番目に来るように、すべての単語の並びをひっくり返すということです。解決のアプローチこの問題は、標準的な配列メソッドを組み合わせるだけでシンプルに実装できます。手順は以下のとおりです。split( ) — 文字列をスペースで分割し、単語の配列を作成するreverse() — 配列の要素の順序を反転させるjoin( ) — 反転した配列をスペースで連結し、再び文字列に戻すコード例以下が実際のコー
-
JavaScriptでスペースの位置を維持したまま文字列を反転させる方法
問題空白(スペース)を含む可能性のある文字列を受け取り、各単語の文字順だけを反転させるJavaScript関数を作成することを考えます。求められる条件は次のとおりです。単語内部の文字は逆順に並べ替える単語と単語を区切るスペースの位置は元のまま維持する異なる単語の文字同士が入れ替わらないようにするアプローチ基本となるアイデアは、「元の文字列を末尾から先頭へ向かって走査し、空白以外の文字を結果用の文字列へ追加していく」というものです。文字を追加するたびに、結果文字列の現在の長さをインデックスとして元の文字列を参照し、その位置がスペースであれば同じくスペースを結果に加えます。こうすることで、スペース