-
JavaScriptでMath.sqrt()を使わずに数値の平方根を求める方法
正の整数を唯一の引数として受け取り、その数値の平方根を計算して返すJavaScript関数を作成する必要があります。ただし、組み込みの Math.sqrt() メソッドは使用しないものとします。アプローチ:ニュートン法による反復計算Math.sqrt() を使わずに平方根を求める代表的な手法の一つが「ニュートン法(Newton-Raphson法)」です。これは、適当な初期値から始めて、次の更新式を繰り返し適用することで、真の平方根へと近づけていく方法です。xn+1 = xn − (xn² − num) / (2 × xn)この式は、「現在の推測値の2乗と目標値との誤差」を「接線の傾き(2 ×
-
JavaScriptで整数分割のすべてのパターンを求める方法
整数分割(パーティション)とは?正の整数 n の「分割」とは、n を正の整数の和として表現する方法のことです。ただし、足し合わせる項の順序が異なるだけで実質的に同じになるものは、同一の分割とみなされます。例えば、4 は以下の5通りの異なる方法で分割できます。43 + 12 + 22 + 1 + 11 + 1 + 1 + 1今回の課題は、正の整数を唯一の引数として受け取るJavaScript関数を作成することです。この関数は、その整数に対して可能なすべての分割の総数を見つけ出し、返却する必要があります。アプローチ:動的計画法(DP)分割の総数を効率よく求めるには、動的計画法(Dynamic Pr
-
JavaScriptでメールアドレスをマスキングしてプライバシーを保護する方法
はじめにWebサイト上で個人のメールアドレスを公開表示する場合、プライバシーを守るためにアドレスをマスキング(一部を伏せて表示)するのはよくある手法です。たとえば、次のようなメールアドレスがあったとします。const email = ramkumar@example.com;これをマスキングすると、次のように表示されます。const masked = r...r@example.com;このように、ローカルパート(@より前の部分)の最初の文字と最後の文字だけを残し、間を「...」で置き換えるのがポイントです。ドメイン部分はそのまま表示します。マスキング関数の実装ここでは、メールアドレスの文字列
-
JavaScriptで解く!組み合わせ合計(Combination Sum)の問題とバックトラッキング実装
問題概要重複のない候補数値(candidates)の集合と、目標値(target)が与えられているとします。ここで求められるのは、候補数値の中から合計が目標値と一致するような、すべての一意な組み合わせを見つける関数を作成することです。なお、同じ数値は候補の中から何度でも繰り返し選択できるものとします。注意点すべての数値(target を含む)は正の整数であること。解の集合には、重複した組み合わせを含めてはいけないこと。例入力が次の場合を考えてみましょう。candidates = [2,3,6,7], target = 7,このときの解は以下のようになります。[ [7], [2,
-
JavaScriptで2つの数値の最小公倍数(LCM)を計算する関数の実装方法
最小公倍数(LCM)とは2つの整数 a と b の最小公倍数(LCM:Least Common Multiple)とは、a と b のどちらでも割り切れる正の整数のうち、最も小さいものを指します。例えばー4と6の最小公倍数は12です。これは、4でも6でも余りなく割り切れる数の中で、12が最も小さいためです。本記事では、2つの数値を受け取り、その最小公倍数を計算して返すJavaScript関数を作成します。実装のポイント:最大公約数との関係最小公倍数を求めるときに役立つのが、次の数学的な関係式です。LCM(a, b) × GCD(a, b) = a × bつまり、最大公約数(GCD/HCF)さえ
-
JavaScriptで2つの文字列間のハミング距離を計算する方法
ハミング距離(Hamming Distance)は、情報理論や符号理論において誤り検出・誤り訂正などに広く活用されている基本的な概念です。ハミング距離とは同じ長さを持つ2つの文字列間のハミング距離とは、対応する位置にある文字が異なる箇所の総数を指します。例として、次の2つの文字列を見てみましょう。const str1 = delhi;const str2 = delph;この2つの文字列のハミング距離は「2」です。4番目と5番目の文字がそれぞれ異なるためです。なお、ハミング距離を計算するには、比較対象となる2つの文字列が必ず同じ長さである必要があります。そこで今回は、str1とstr2という2
-
JavaScriptでブロック検索を実装する方法【O(√n)の探索アルゴリズム】
ブロック検索とはブロック検索(Block Search)は、二分検索と同様にソート済み配列を対象とした検索アルゴリズムの一つです。すべての要素を順番に調べる線形検索と異なり、固定されたステップ幅で前方へジャンプしながら候補を絞り込んでいくため、確認する要素数を大幅に減らせることが特徴です。基本的な考え方長さnの配列arrと、ジャンプ幅(ブロックサイズ)mを例に考えてみましょう。まず、arr[0]、arr[m]、arr[2×m]、…、arr[k×m] のようにインデックスを飛び飛びに確認していきます。そして、arr[k×m] < x < arr[(k+1)×m] という区間が見つかっ
-
JavaScriptで階段の登り方の総数を求めるアルゴリズム
問題の概要 次のような問題を考えてみましょう。 段数がnの階段があり、下に立っている人が最上部まで登ろうとしています。この人は一度に1段または2段ずつ登ることができます。このとき、頂上にたどり着く方法が何通りあるかを数える必要があります。 つまり、階段の段数nを受け取り、登り方の総数を計算して返すJavaScript関数を実装することが求められます。 解き方のポイント この問題はフィボナッチ数列と密接な関係があります。n段目に到達するには、「(n-1)段目から1段登る」か「(n-2)段目から2段登る」かの2通りの選択肢しかないため、次の漸化式が成り立ちます。 ways(n) = ways(n
-
JavaScriptで角度を度からラジアンに変換する方法
ラジアンとは ラジアン(radian)は角度を表す単位の一つで、数学の多くの分野において標準的に使われている角度の測定単位です。1ラジアンは、「円の半径と同じ長さの弧が中心に対して張る角度」として定義されます。 本記事では、度数法の角度(度)を表す数値を受け取り、対応するラジアンの値を返すJavaScript関数を作成します。 度からラジアンへの変換式 度をラジアンに変換するには、次の公式を使用します。 ラジアン = 度 × (π ÷ 180) 円一周(360度)が 2π ラジアンに相当するため、この係数を掛けるだけで変換が可能です。 コード例 以下は実際の実装コードです。 const de
-
JavaScriptで配列のべき集合(パワーセット)を求める方法
ある集合 S のべき集合(パワーセット)とは、S のすべての部分集合からなる集合のことです。空集合と S 自身も含まれ、P(S) という記号で表されます。べき集合とは?具体例たとえば、S = {x, y, z} の場合、部分集合は以下の8つになります。{ {}, {x}, {y}, {z}, {x, y}, {x, z}, {y, z},  
-
JavaScriptでレーベンシュタイン距離を計算する方法
レーベンシュタイン距離とは レーベンシュタイン距離(編集距離)とは、2つの文字列がどれだけ異なっているかを数値で表す文字列メトリックの一つです。具体的には、一方の文字列をもう一方の文字列へ変換するために必要となる、1文字単位の編集操作(挿入・削除・置換)の最小回数として定義されます。 たとえば―― 次の2つの文字列を考えてみましょう。 const str1 = hitting; const str2 = kitten; この2つの文字列間のレーベンシュタイン距離は 3 になります。これは、以下の3回の編集操作で変換できるためです。 kitten → hitten(「k」を「h」に置換) h
-
JavaScriptで学ぶ補間探索(Interpolation Search)の基本と実装方法
補間探索(Interpolation Search)とは補間探索は、キーに割り当てられた数値(キー値)によって昇順にソートされた配列の中から、特定のキーを効率的に見つけ出すための検索アルゴリズムです。二分探索が常に範囲の中央を確認するのに対し、補間探索は「値の分布」を考慮して、ターゲットが存在しそうな位置を予測してアクセスする点が大きな特徴です。データが一様に分布している場合、平均時間計算量はO(log log n)と非常に高速に動作します。具体的な例例えば、一様に分布したn個の値を持つソート済み配列arr[]があるとします。この中から特定の要素targetを検索する関数を作成するケースを考え
-
JavaScriptで文字列が特定の文字列で始まるか・終わるかを判定する関数の書き方
本記事では、2つの文字列を引数として受け取るJavaScript関数の実装方法を解説します。それぞれの引数を str1 と str2 と呼びます。この関数の役割は、str1がstr2で始まるか、またはstr2で終わるかを判定することです。いずれかの条件に一致すれば true を返し、どちらにも一致しなければ false を返します。実装のポイント判定処理では、以下のロジックを使用します。まず、str2 の長さが str1 よりも長い場合は、開始・終了のいずれにもなり得ないため false を返します。両者の文字列が完全に一致する場合は true を返します。substring() メソッドを使
-
JavaScriptでオブジェクトを2次元配列に変換する方法【サンプルコード付き】
ここでは、ある都市の天気情報を持つ次のようなオブジェクトを例に考えてみます。 const obj = { city: New Delhi, maxTemp: 32, minTemp: 21, humidity: 78, aqi: 456, day: Tuesday, }; このオブジェクトを引数として受け取り、元のオブジェクトをもとに「配列の中に配列が入った2次元配列」を構築するJavaScript関数を作成します。各サブ配列には、必ず次の2つの要素が含まれるようにします。 対応するキー そのキーの値 したがって、上記のオブジェクトの場合、期
-
JavaScriptで配列の配列をオブジェクトに変換する方法
はじめにJavaScriptでは、「キーと値のペア」を格納した配列の配列(ネストされた配列)を、扱いやすいオブジェクトへ変換したい場面がよくあります。本記事では、その具体的な実装方法をわかりやすく解説します。例として、あるクリケット選手の成績データを表す次のような配列の配列を想定してみましょう。const arr = [ [Name, V Kohli], [Matches, 13], [Runs, 590], &nb
-
JavaScriptで文字列の先頭と末尾から「?」を削除する方法
本記事では、文字列を唯一の引数として受け取り、その先頭と末尾に含まれる「?」(半角クエスチョンマーク)だけを削除するJavaScript関数の作成方法を解説します。文字列の途中にある「?」はそのまま保持し、両端のみをトリミングするのがポイントです。要件の確認求められる動作は以下のとおりです。引数として渡された文字列の先頭・末尾に連続して並ぶ「?」をすべて除去する文字列内部(中間)に存在する「?」は削除しないそれ以外の文字は一切変更しない入出力の例たとえば、入力文字列が次の場合:const str = ??this is a ? string?;期待される出力は以下になります。const out
-
JavaScriptで文字列のn文字ごとに文字を挿入する方法
課題の概要 JavaScriptで、次の3つの引数を受け取る関数を作成することを考えます。 第1引数:対象となる文字列 第2引数:挿入間隔となる数値(文字列の長さより小さい値が保証されています) 第3引数:挿入したい1文字(以下「char」と呼びます) この関数は、文字列の中でn文字ごとの位置にcharを挿入し、その新しい文字列を返す必要があります。 入力例 const str = NewDelhi; const n = 3; const char = ; 期待される出力 const output = Ne wDe lhi; 解決策のコード ここでは、文字列を一度反転させてから正規
-
JavaScriptにおけるループ版と再帰版の階乗関数のパフォーマンス徹底比較
本記事では、数値を引数として受け取り、その階乗を返す2つのJavaScript関数を作成し、それぞれの処理速度を実際に計測して比較します。 1つ目の関数はforループ(またはwhileループ)を使って階乗を計算する反復的なアプローチ、2つ目の関数は自分自身を呼び出す再帰的なアプローチを採用します。最後に、大量のイテレーションを実行した際にかかる時間をconsole.time()メソッドで測定し、両者の性能差を確認します。 コード例 以下が実際のコードです。 const factorial = (num = 1) => { let result = 1; for (let
-
【JavaScript】数値が素数かどうかを判定する方法とサンプルコード
素数とは素数(そすう・プライム)とは、1より大きい自然数のうち、「それより小さい2つの自然数の積」として表すことができない数のことです。例えば、5は素数ですが、6は2×3と表せるため素数ではありません。1より大きい素数以外の自然数はすべて合成数と呼ばれます。素数判定(Primality Test)とは、入力された数値が素数であるかどうかを判定するためのアルゴリズムです。本記事では、数値を引数として受け取り、その数が素数かどうかを判定するJavaScript関数を実装します。素数判定の考え方効率的に素数を判定するには、次の順序でチェックを行います。整数でない数値(小数)は素数ではない1以下の数値
-
ユークリッドの互除法を使ってJavaScriptで最大公約数(GCD)を求める方法
数学におけるユークリッドの互除法(Euclids algorithm)とは、2つの数の最大公約数(GCD)、すなわち両方の数を余りなく割り切れる最大の数を求めるための古典的なアルゴリズムです。このアルゴリズムは、「2つの数の最大公約数は、大きい方の数を『大きい数から小さい数を引いた差』に置き換えても変化しない」という原理に基づいています。例えば、252 と 105 の最大公約数は 21 です(252 = 21 × 12、105 = 21 × 5)。同様に、105 と 147(= 252 − 105)の最大公約数もやはり 21 になります。この置き換えを行うたびにペアの中の大きい方の数は必ず小さ