JavaScriptで文字列の各文字を1始まりのインデックス回数だけ繰り返す方法
問題
英小文字(a〜z)のみで構成された文字列を受け取り、特定のルールに従って新しい文字列を構築するJavaScript関数を作成する必要があります。
ルールは以下のとおりです。
- 各文字を、その文字列内での1始まりのインデックスの回数だけ繰り返す
- 繰り返し後の文字列の先頭の文字を大文字にする
- 異なる文字のグループ同士はダッシュ「-」で区切る
たとえば、文字列「abcd」の場合、出力は次のようになります。
"A-Bb-Ccc-Dddd"
コード例
以下は、forループを使った基本的な実装例です。
const str = 'abcd';
const repeatStrings = (str) => {
const res = [];
for (let i = 0; i < str.length; i++) {
const el = str[i];
// 1始まりのインデックス回数だけ文字を繰り返す
let temp = el.repeat(i + 1);
// 先頭の1文字を大文字に変換
temp = temp[0].toUpperCase() + temp.substring(1, temp.length);
res.push(temp);
}
// ダッシュで連結して返す
return res.join('-');
};
console.log(repeatStrings(str));
出力
A-Bb-Ccc-Dddd
コードの解説
このコードのポイントを順番に見ていきましょう。
- String.prototype.repeat(n):文字列を n 回繰り返した新しい文字列を返すメソッドです。
el.repeat(i + 1)により、現在の文字を1始まりのインデックス回数だけ繰り返しています。 - toUpperCase() と substring():繰り返し後の文字列の先頭1文字だけを大文字に変換し、残りの部分は元のまま結合しています。
- Array.prototype.join('-'):各文字ごとの結果を配列に蓄積し、最後にダッシュ区切りで1つの文字列に連結しています。
別の書き方:map を使った簡潔な実装
map を使うと、同じ処理をより簡潔に記述することもできます。
const repeatStrings = (str) =>
str
.split('')
.map((ch, i) => ch.toUpperCase() + ch.repeat(i))
.join('-');
console.log(repeatStrings('abcd')); // A-Bb-Ccc-Dddd
この方法では、先頭の大文字1文字と、それに続く小文字の繰り返し(インデックス i 回)を組み合わせることで、同じ結果を少ないコード量で得られます。入力がすべて小文字であることが保証されている場合に有効なアプローチです。
-
JavaScriptでアルファベットの1始まりのインデックスを取得する方法
問題JavaScriptで関数を作成する必要があります。この関数は、小文字の英字アルファベット1文字を受け取り、その文字がアルファベットの中で何番目に位置するかを「1始まり」のインデックスとして返します。例えば、a なら 1、j なら 10 を返すといったイメージです。無効な入力が渡された場合は -1 を返してエラーを通知すると親切です。実装の考え方最もシンプルな方法は、先頭に半角スペースを付けたアルファベット文字列「 abcdefghijklmnopqrstuvwxyz」を基準(レジェンド)として用意することです。こうすることで、スペースが0番目となり、a は1番目、j は10番目というよう
-
JavaScriptで文字の出現頻度に基づいて文字列をエンコードする方法
問題文字列 str を唯一の引数として受け取る JavaScript 関数を作成する必要があります。この関数は、入力文字列をもとに新しい文字列を生成します。元の文字列の中でその文字が1回だけ出現する場合には「(」を、2回以上出現する場合には「)」を、対応する位置に割り当てます。なお、大文字と小文字の違いは無視して判定します。例えば、関数への入力が次の場合 −入力const str = Success;出力const output = )())());考え方入力文字列「Success」を大文字小文字を区別せずに見ると、「s」は3回、「u」は1回、「c」は2回、「e」は1回出現しています。したがっ