-
【JavaScript】指定した上限以下の偶数フィボナッチ数の合計を求める方法
本記事では、数値(上限値)を引数として受け取り、その上限未満にあるフィボナッチ数の中から偶数のみを抽出し、それらの合計を計算して返すJavaScript関数の実装方法を解説します。問題の概要関数には上限となる数値が渡されます。この関数は、フィボナッチ数列を順に生成しながら、上限を超えない範囲で偶数の項だけを足し合わせていきます。具体例たとえば、上限が 100 の場合を考えてみましょう。100 未満のフィボナッチ数は次の通りです。1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89このうち偶数である項は以下の3つです。2, 8, 34したがって、関数が返すべき出力は次のように
-
JavaScriptで絶対値の合計が最小になる整数xを求める方法
ソート済みの整数配列 arr が与えられたとします。このとき、次の式の値が最小となるような整数 x を見つけるのが課題です。 abs(a[0] - x) + abs(a[1] - x) + ... + abs(a[a.length - 1] - x) ここで abs は絶対値を表します。条件を満たす答えが複数存在する場合は、その中で最も小さい値を出力します。 例 たとえば、 arr = [2, 4, 7] の場合、出力は次のようになります。 absoluteValuesSumMinimization(arr) = 4 これは、abs(2 - 4) + abs(4 - 4) + abs(7 -
-
文字列メソッド・配列なしでJavaScriptの整数の桁を並べ替える方法
問題の概要数値を引数として受け取り、その桁を並べ替えて作れる「最小の数」を返すJavaScript関数を作成します。たとえば、入力が次の数値だった場合:const num = 614532;出力は次のようになります:const output = 123456;制約条件この問題には重要な条件があります。Stringオブジェクトのメソッドは一切使えず、データの格納に配列も使用できないという点です。つまり、純粋な数値演算だけで各桁を並べ替える必要があります。実装コードconst num = 614532; const sortDigits = num => { const getDig
-
JavaScriptで数値の各桁を合計し、1桁になるまで繰り返す方法
本記事では、数値を引数として受け取り、その各桁の合計を計算し、結果が1桁になるまでこの処理を繰り返すJavaScript関数の実装方法を解説します。 問題の概要 求められているのは、数値を唯一の入力として受け取るJavaScript関数です。この関数が行うべき処理はシンプルで、以下の通りです。 各桁の数字を合計し、その結果が1桁の数値に収束するまで同じ処理を繰り返す 処理の流れ(例) 例えば、次のような数値が与えられたとします。 const num = 5798; この場合、計算は以下のように進みます。 5 + 7 + 9 + 8 = 29 2 + 9 = 11 1 + 1 = 2 したが
-
【JavaScript】対応する負の値が配列内に存在する正の値だけを抽出して返す方法
本記事では、正と負の数値が混在する数値の配列を受け取り、対応する負の値が同じ配列内に存在する正の値だけを抽出して返すJavaScript関数の実装方法を解説します。 たとえば、次のような入力配列を考えてみましょう。 const arr = [1, 5, -3, -5, 3, 2]; この場合、期待される出力は以下のとおりです。 const output = [5, 3]; 「5」と「3」は、それぞれ「-5」「-3」が配列内に存在するため結果に含まれます。一方、「1」と「2」には対応する「-1」「-2」が存在しないため、結果から除外されます。 実装コード 実際のコードは次のようになります。 co
-
JavaScriptで配列の合計から値を均等に減算し、結果を非負に保つ方法
整数の配列と、その配列の合計から差し引きたい値が与えられたとします。 たとえば、次のようなケースです。 [4, 5, 6, 7, 8] − 25 全要素に25を均等に割り振って減算すると、結果は次のようになります。 [−1, 0, 1, 2, 3] しかし今回は、結果に0未満の値を含めたくないという条件があります。 この条件を満たすアルゴリズムを考えると、マイナスになってしまった分は、残りのプラスの値に対して均等に振り替える必要があります。まず先頭の要素が0になり、減算しきれなかった不足分が後続の要素へ引き継がれます。 [0, 0, 1, 2, 3] − 1 この不足分1を残りの3つの要素で均
-
JavaScriptで合計がnになるm個の数値の組み合わせを生成する方法
問題の概要1から9までの数字のみを使い、重複のない組み合わせの中から、m個の数字を合計するとちょうどnになるすべての組み合わせを求める関数を作成します。各組み合わせ内で同じ数字を複数回使うことはできません。たとえば、入力が次の場合:const m = 3, n = 9;出力は次のようになります。const output = [ [1, 2, 6], [1, 3, 5], [2, 3, 4]];アプローチ:再帰によるバックトラッキングこの種の問題は、再帰的な深さ優先探索(バックトラッキング)を使うと効率的に解けます。各ステップで「現在の数字を採用する」「採用しない」という2つの分岐を試し、
-
JavaScriptで単語を区切らずに文字列を固定長のブロックへ分割する方法
JavaScriptで、段落のテキストを含む文字列を第1引数に、チャンクサイズ(分割する長さ)を数値で第2引数に受け取る関数を作成する必要があります。この関数には、次のような動作が求められます。文字列を、指定されたチャンクサイズ(第2引数)を超えない長さのかたまりに分割する分割は空白(スペース)または文末でのみ行い、単語の途中で切らない具体例たとえば、入力が次の場合を考えてみましょう。const str = this is a string; const chunkLength = 6;このとき、期待される出力は次のとおりです。const output = [this, is a, strin
-
JavaScriptで複数の数の倍数の合計を求める方法
問題の概要JavaScriptでは、第一引数として数値 n を受け取り、その後に任意の個数の引数を受け取る関数を作成することが求められます。この関数の目的は、第二引数以降で指定された数値のいずれかで割り切れる、n以下のすべての数値を合計することです。具体例例えば、関数を次のように呼び出した場合を考えてみましょう。sumMultiples(15, 2, 3);このとき、期待される出力は次のとおりです。const output = 83;これは、該当する数値が以下のとおりだからです。2, 3, 4, 6, 8, 9, 10, 12, 14, 15上記の数値をすべて足すと 83 になります。これらは
-
JavaScriptで「2乗の和」と「和の2乗」の差を求める方法
数値 n を唯一の引数として受け取るJavaScript関数を作成することを考えます。この関数は、以下の3つの処理を行います。最初のn個の自然数の2乗の和(1² + 2² + … + n²)を計算する最初のn個の自然数の和の2乗((1 + 2 + … + n)²)を計算する両者の差の絶対値を返す例として、n = 5 の場合を確認してみましょう。2乗の和 = 1 + 4 + 9 + 16 + 25 = 55 和の2乗 = (1 + 2 + 3 + 4 + 5)² = 15 × 15 = 225したがって、出力結果は 225 − 55 = 170 となります。実装コードこの問題を解くJavaScr
-
JavaScriptで文字列内のアルファベットを並べ替える方法
問題の概要 たとえば、次のようなカンマ区切りの単語列があるとします。 const str = 'JAY, ROB'; ここで求められるのは、このような文字列を引数として受け取るJavaScript関数を作成することです。この関数は、文字列内の各単語の文字を使い、「前のアルファベットが常に次のアルファベット以上になる」(たとえば A は B より大きい)という条件を満たす新しい単語を組み立てます。 上記の例で言えば、まず「JAY」の1文字目と「ROB」の1文字目を比較します。 J は R よりも前に位置するため、新しい単語の1文字目は J になります。続いて2文字目を比較すると
-
【JavaScript】文字列を左・右に循環シフトする関数の実装方法
JavaScriptでは、文字列と2つの数値(m と n)を受け取る関数が必要になることがあります。ここで m は左シフトの回数、n は右シフトの回数を表します。 左シフトとは 左シフトとは、文字列を1回循環回転させる操作で、先頭の文字が末尾に移動し、それ以外のすべての文字が1つずつ左へずれます。 例えば、abcde は1回の左シフトで bcdea になり、2回の左シフトで cdeab になります。 右シフトとは 右シフトとは、その逆の操作です。末尾の文字が先頭に移動し、残りのすべての文字が1つずつ右へずれます。 例えば、abcde は1回の右シフトで eabcd になり、2回の右シフトで
-
JavaScriptで正の整数をローマ数字に変換するプログラムの作り方
はじめに本記事では、正の整数(10進数)を受け取って、そのローマ数字表現を返すJavaScript関数を作成します。ローマ数字とは、I(1)・V(5)・X(10)・L(50)・C(100)・D(500)・M(1000)などの記号を組み合わせて数を表す、古代ローマに由来する記数法のことです。桁ごとの対応表を定義する変換には、数値とローマ数字の対応表(レジェンド)を使用します。1の位から9000まで、IVやXLのような減算記法のパターンも含めて、あらかじめすべて定義しておくのがポイントです。const legend = { 1: I, 2: II, 3: III, 4: IV, 5: V, 6:
-
【JavaScript】数値の重み(桁の合計)に基づいて配列をソートする方法
数値の「重み」とは? 数値の重み(weight)とは、その数値を構成する各桁の数字をすべて足し合わせた合計のことです。具体例を見てみましょう。 100 の重み → 1 + 0 + 0 = 1 22 の重み → 2 + 2 = 4 99 の重み → 9 + 9 = 18 123 の重み → 1 + 2 + 3 = 6 実現したいこと 今回作成するのは、数値の配列を受け取り、各数値の重みが小さい順(昇順)に並べ替えるJavaScript関数です。さらに、2つの数値の重みが同じだった場合には、数値そのものの昇順で並ぶようにします。 たとえば、50 と 23 はどちらも重みが 5 で等しいため、このケ
-
【JavaScript】スペース区切りの文字列から要素の出現頻度をカウントする方法
問題の概要 次のように、空白(スペース)で区切られた複数の文字を含む文字列があるとします。 const str = a b c d a v d e f g q; このような文字列を引数として受け取り、各要素とその出現回数をペアにしたオブジェクトの配列(頻度配列)を返すJavaScript関数を作成しましょう。出現回数が多い順に並べ替えて返すのがポイントです。 実装コード 以下が実際のコードです。 const str = a b c d a v d e f g q; const countFrequency = (str = ) => {  
-
JavaScriptで配列を指定した個数のサブ配列に分割(チャンク化)する方法
JavaScriptでは、数値の配列を第1引数として受け取り、単一の数値 num を第2引数として受け取る関数を実装する必要があります。ここで num は常に配列の長さ以下であるものとします。この関数の役割は、num 個のサブ配列を含む新しい配列を生成することです。元の配列の長さが num でちょうど割り切れる場合、すべてのサブ配列は同じ要素数を持ちます。割り切れない場合は、最後のサブ配列だけが異なる要素数になります。入力例と期待される出力たとえば、入力が以下のようなケースを考えてみましょう。const arr = [1, 2, 3, 4, 5, 6, 7, 8]; const num = 3
-
JavaScriptで2進数の配列を加算するアルゴリズムの実装方法
この記事では、JavaScriptを使って「0」と「1」のみで構成された2進数の配列同士を加算し、その結果を新しい配列として返すアルゴリズムを解説します。 2進数の加算の基本 2進数の加算は、次の4つの基本ルールに従います。 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 10 ポイントは「1 + 1 = 10」、つまり桁があふれたときに繰り上がり(キャリー)が発生する点です。これは、私たちが普段行う10進数の筆算と同じ考え方です。下の桁から順に足していき、合計が基数(2進数なら2)以上になったら繰り上がりを処理します。 実装すべき処理の内容 ここで求められるの
-
JavaScriptで2つの配列のサブセット(部分集合)を判定する方法
リテラル値からなる2つの配列を受け取り、第2引数の配列が第1引数の配列の部分集合(サブセット)であるかどうかを判定するJavaScript関数を作成する必要があります。この判定を行う際には、以下の条件を考慮する必要があります。array2には、array1に含まれるすべての値が定義されている必要があるarray1に重複した値が存在する場合、その重複数もarray2側で考慮されなければならない具体例たとえば、arr1 = [a, a] と arr2 = [b, a] を比較すると、「a」は最初の配列に2回登場していますが、2番目の配列では1回しか登場していないため、isSubset の結果は f
-
JavaScriptで合計してターゲット値になるすべてのペアを検索する方法
JavaScriptでは、数値の配列を第1引数として受け取り、目標となる合計値(target)を第2引数として受け取る関数を実装する必要があります。この関数は、配列内から2つの数値を選んだときに、その合計が指定された目標値と一致するすべてのペアを抽出し、配列として返すものです。アプローチここではマップ(ハッシュ)オブジェクトを活用してペアを効率的に検出します。具体的には、配列を先頭から順に走査しながら、「目標値 − 現在の値」に相当する数値(相方となる数)をキーとして記録していきます。後から走査した要素がそのキーに一致すれば、合計が目標値になるペアが存在すると判断でき、結果配列に追加します。こ
-
JavaScriptで単方向リンクリストから特定の値のノードを削除する方法
単方向リンクリストとは 連結リスト(リンクリスト)は、各ノードが「値(value)」と「次のノードへの参照(next)」を持つデータ構造です。配列と異なり、要素の追加や削除を参照の付け替えだけで行えるのが特徴です。ここでは、次のような単方向リンクリストを例に考えます。 const list = { value: 1, next: { value: 2, next: { value: 3, next: { value: 4, next: { value: 5, next: {