JavaScriptで文字列内の冗長文字の数を数える方法
課題
JavaScriptで、文字列を引数として受け取り、その文字列に含まれる冗長文字(重複して出現する文字)の総数を返す関数を作成します。
たとえば、次のような文字列の場合:
const str = 'abcde';
すべての文字が一度しか登場しないため、出力は 0 になります。
一方、次のような文字列の場合:
const str = 'aaacbfsc';
「a」が2回余分に出現し、「c」が1回余分に出現しているため、出力は 3 になります。
解決のアプローチ
この問題は、lastIndexOf() メソッドを使うと簡潔に解決できます。文字列内の各文字について、現在のインデックスと、その文字が最後に出現するインデックスを比較します。両者が一致しない場合、その文字は後ろにもう一度出現する、つまり冗長な文字だと判断できるのです。
コード例
const str = 'aaacbfsc';
const countRedundant = str => {
let count = 0;
for(let i = 0; i < str.length; i++){
if(i === str.lastIndexOf(str[i])){
continue;
};
count++;
};
return count;
};
console.log(countRedundant(str));出力
コンソールには次の結果が表示されます。
3
コードの解説
まずループで文字列を先頭から順に走査し、各文字 str[i] が最後に出現する位置を str.lastIndexOf(str[i]) で取得します。現在のインデックス i がその位置と一致していれば、それ以降に同じ文字は現れないため continue でスキップします。一致しなければ、その文字は後続にもう一度出現する冗長な文字なので、カウントを1つ増やします。この仕組みにより、2回目以降の出現だけが正確に数えられるのです。
計算量に関する補足
上記の実装では、ループのたびに lastIndexOf() が文字列を走査するため、時間計算量は O(n²) になります。非常に長い文字列を扱う場合は、Map やオブジェクトであらかじめ各文字の出現回数を集計し、「出現回数 − 1」の合計を返す方式にすると、O(n) でより効率的に処理できます。
-
JavaScriptで数値文字列を0と1のビット列にエンコードする方法
問題 10進数を表す文字列を受け取り、決められたルールに従って「0」と「1」だけで構成される文字列へエンコードするJavaScript関数を実装します。 エンコードのルール 入力文字列の各桁の数字 d に対して、次の手順で符号語を作ります。 d を2進数で表したときのビット数を k とする 「0」を k−1 個並べ、その後ろに「1」を1つ付けた文字列をプレフィックスとする 数字 d 自身を2進数の文字列として表す(最右ビットが最下位ビット) プレフィックスと2進表現を連結したものが d の符号語になる 最後に、すべての桁について得られた符号語を順番に連結したものが、全体のエンコード結果と
-
JavaScriptで不正な時間文字列(HH:MM:SS)を正規化して修正する方法
JavaScriptでは、「HH:MM:SS」形式の時間文字列を扱う場面がよくあります。しかし、時間の加算処理などで計算ミスが発生すると、分や秒が60を超えてしまう「壊れた」時間文字列が生成されることがあります。この記事では、そうした不正な時間文字列を正しく正規化する方法を解説します。 課題:壊れた時間文字列とは 今回求められるのは、JavaScriptで「HH:MM:SS」形式の時間文字列を受け取り、必要な修正を加えた上で、正しい時間文字列として返す関数を作成することです。 問題になるのは、加算処理のバグによって、次のような不正な値が含まれてしまうケースです。 MM(分)の部分が60を超え