-
JavaScriptでソートすべき最短の部分配列の長さを求める方法
問題数値の配列 arr を最初の(そして唯一の)引数として受け取るJavaScript関数を作成する必要があります。この関数の目的は、ある連続した部分配列を見つけ、その部分配列だけを昇順にソートしたときに、配列全体が昇順にソートされた状態になるようにする、その部分配列の長さを求めることです。例えば、関数への入力が以下の場合を考えてみましょう。const arr = [3, 7, 5, 9, 11, 10, 16];このとき、出力は次のようになります。const output = 5;出力の説明[7, 5, 9, 11, 10] の部分配列だけをソートすると、配列全体が昇順に並び替えられるためで
-
JavaScriptで2次元配列を指定した行数・列数に再形成する方法
問題JavaScriptの関数を作成します。この関数は、第1引数として数値の2次元配列 arr を受け取り、続く2つの引数として、変換後の行列の行数と列数を表す数値 r および c を受け取ります。関数は、入力配列と同じ行優先(row-traversing)順序で要素を並べ替えたうえで、指定された行数と列数を持つ新しい2次元配列を生成して返す必要があります。たとえば、関数への入力が次の場合:const arr = [ [6, 7], [8, 9] ]; const r = 1, c = 4;期待される出力は次のとおりです。const output = [[6, 7, 8, 9]];出力
-
JavaScriptで配列のネストされた集合の最長の長さを見つけて返す方法
問題数値の配列 arr を第一引数(かつ唯一の引数)として受け取るJavaScript関数を作成する必要があります。長さ N の配列 arr には、0 から N-1 までのすべての整数がちょうど1回ずつ含まれています。この関数では、次のルールに従って構成される集合 S の最長の長さを見つけ、その結果を返す必要があります。ここで、S[i] = {A[i], A[A[i]], A[A[A[i]]], ...} と定義されます。具体的には、S の最初の要素としてインデックス i の要素 A[i] を選択することから始め、次の要素は A[A[i]]、その次は A[A[A[i]]]… というように順に辿
-
JavaScriptで配列から三角形を作れる組み合わせの数を数える方法
問題 数値の配列 arr を第一引数(唯一の引数)として受け取る JavaScript 関数を作成します。 この関数の目的は、配列から選んだ3つの数値を三角形の3辺としたときに、実際に三角形が成立する組み合わせ(三つ組)の総数を数えることです。 たとえば、関数への入力が次のようだった場合: const arr = [2, 2, 3, 4]; 期待される出力は次のとおりです。 const output = 3; 出力の解説 有効な組み合わせは以下の3通りです。 2,3,4(1つ目の2を使用) 2,3,4(2つ目の2を使用) 2,2,3 三角形の成立条件 3つの辺 a、b、c(a ≤ b ≤ c
-
JavaScriptでアルファベットの1始まりのインデックスを取得する方法
問題JavaScriptで関数を作成する必要があります。この関数は、小文字の英字アルファベット1文字を受け取り、その文字がアルファベットの中で何番目に位置するかを「1始まり」のインデックスとして返します。例えば、a なら 1、j なら 10 を返すといったイメージです。無効な入力が渡された場合は -1 を返してエラーを通知すると親切です。実装の考え方最もシンプルな方法は、先頭に半角スペースを付けたアルファベット文字列「 abcdefghijklmnopqrstuvwxyz」を基準(レジェンド)として用意することです。こうすることで、スペースが0番目となり、a は1番目、j は10番目というよう
-
【JavaScript】入力配列の各要素について「右側にある小さい要素の個数」を数えた配列を作成する方法
問題数値の配列を受け取り、それをもとに出力用の配列を構築する JavaScript の関数を作成することを考えます。出力配列の各要素には、入力配列の対応する要素よりも右側に存在し、かつその要素より小さい数値の個数を格納します。最後に、この配列を返します。例えば、[6, 2, 8, 5, 1, 3] という入力に対しては、以下のような出力が期待されます。6 の右側にある小さい数 → 2, 5, 1, 3 の 4 個2 の右側にある小さい数 → 1 の 1 個8 の右側にある小さい数 → 5, 1, 3 の 3 個5 の右側にある小さい数 → 1, 3 の 2 個1 の右側にある小さい数 → 0
-
【JavaScript】配列の先頭要素との差分(+/-)を文字列配列として構築する方法
問題正の整数のみを含む配列を受け取り、その各要素を「文字列型の整数」へ変換した新しい配列を返すJavaScript関数を作成する必要があります。この新しい配列には、配列の先頭の要素に対して、いくつ加算(または減算)すると対応する要素の値になるかを示す文字列を格納します。たとえば、次のような入力が与えられた場合:[4, 3, 6, 2]期待される出力は以下のとおりです:[+0, -1, +2, -2]解決のアプローチこの問題は、各要素から先頭要素を引いた差分を計算し、その結果が0以上であれば「+」記号を付けて文字列化すれば解決できます。ポイントは、負の数の場合です。JavaScriptでは数値を
-
JavaScriptで指定した範囲内の整数ペアを生成する方法
問題数値 n を引数として受け取る JavaScript 関数を作成します。この関数は、以下の条件を満たす整数のペア [a, b] をすべて含む配列を返す必要があります。0 <= a <= b <= nつまり、a と b はどちらも 0 以上 n 以下であり、かつ a は b 以下である必要があります。例えば n = 4 の場合、(0, 0) から (4, 4) までの15通りの組み合わせが生成されます。実装コード二重ループを使うことで、条件を満たすすべてのペアを効率よく列挙できます。外側のループ変数 i を a、内側のループ変数 j を b とし、j を i から開始するこ
-
JavaScriptで各桁が左隣の桁で割り切れるかを判定する方法
問題 数値を受け取り、その各桁が左隣(ひとつ前)の桁で割り切れるかどうかを判定し、真偽値(boolean)の配列として返すJavaScript関数を作成する必要があります。 最初の桁にはそれより前に桁が存在しないため、返される配列の先頭は必ず false となります。 実装例 以下がそのコードです。 const num = 73312; const divisibleByPrevious = (n = 1) => { const str = n.toString(); const arr = [false]; for(let i = 1; i < str.l
-
JavaScriptで配列を降順に並べ替えて隣接要素の差の合計を求める方法
問題 整数の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列を降順に並べ替えたうえで、隣り合う要素同士の差を順番に足し合わせ、その合計値を返すものです。 たとえば、次のような配列が渡された場合を考えてみましょう。 [6, 2, 15] この場合、期待される出力は次のとおりです。 (15 - 6) + (6 - 2) = 13 解決のアプローチ この問題は、以下の手順でシンプルに解くことができます。 sort()メソッドを使い、配列を降順(大きい順)に並べ替える。 隣接する2つの要素(i番目と i + 1 番目)の差を計算し、合計に加算していく。 配列の要素
-
JavaScriptで数値の桁を並べ替えて最大値を作る方法
この記事では、与えられた整数の各桁を並べ替えて、表現できる最大の数を求めるJavaScript関数の実装方法を解説します。問題数値 n を引数として受け取るJavaScript関数を用意します。この関数は、n の各桁を自由に入れ替えることで作れる最大の値を返す必要があります。たとえば「124」という数値の場合、各桁(1・2・4)を大きい順に並べ替えることで、最大値である「421」が得られます。アプローチ:大きい桁を左に置く最大の数を作るための基本戦略はシンプルで、「大きな数字ほど上位の桁(左側)に配置する」ことです。これを実現するために、次の手順で処理を行います。数値を文字列に変換し、1桁ずつ
-
JavaScriptで文字列数値の後半の桁を0に変換する方法
問題文字列形式の数値を唯一の引数として受け取るJavaScript関数を作成する必要があります。この関数は、入力された数値の後半の桁をすべて「0」に置き換えた結果を返すものとします。桁数が奇数の場合は、中央の桁から後ろをすべて0に変更します。例えば、以下のように変換されます。938473 → 938000コード例以下が実装コードです。const num = 938473;const convertHalf = (num = ) => { let i = num.toString(); let j
-
JavaScriptでインデックスの合計が最小となる共通要素を見つける方法
問題概要2つの配列 arr1 と arr2 を引数として受け取るJavaScriptの関数を作成します。この関数の目的は、両方の配列に共通して存在する要素のうち、各配列におけるインデックスの合計(リストインデックスサム)が最小になる要素を見つけ出すことです。条件を満たす要素が複数ある場合は、順序を問わずすべてを出力します。入力例const arr1 = [a, b, c, d]; const arr2 = [d, a, c];出力例const output = [a];出力の解説両方の配列に共通する要素は「d」と「a」です。それぞれのインデックスの合計を計算すると、「d」の場合:arr1でのイ
-
JavaScriptで3つの配列に共通する要素の合計を求める方法
問題今回は、3つの数値型配列を引数として受け取るJavaScript関数を作成します。この関数は、3つの配列すべてに共通して存在する要素だけを抜き出し、それらの合計値を返す必要があります。たとえば、次のような配列が与えられた場合を考えてみましょう。const arr1 = [4, 4, 5, 8, 3]; const arr2 = [7, 3, 7, 4, 1]; const arr3 = [11, 0, 7, 3, 4];この場合、3つの配列すべてに存在するのは「4」と「3」なので、期待される出力は 4 + 3 = 7 となります。解決策のコード例以下がその実装コードです。 { le
-
JavaScriptで文字列の二次元配列をソートして対角要素を見つける方法
本記事では、文字列の配列を扱うJavaScriptのアルゴリズム問題を解説します。「配列をアルファベット順にソートした後、対角線上の文字を抽出する」というシンプルながら応用範囲の広いテクニックを、サンプルコードとともにわかりやすく紹介します。 問題 n個の文字列を要素として持つ配列を受け取るJavaScript関数を作成します。ここで、配列内の各文字列はすべてちょうどn文字で構成されているものとします。つまり、この配列はn×nの正方行列として扱うことができます。 関数には以下の2つの処理が求められます。 まず、配列をアルファベット順(辞書順)にソートすること 次に、ソート後の配列を行列とみな
-
JavaScriptで配列内の要素が指定回数を超える出現を削除する方法
問題 最初の引数として数値の配列、2番目の引数として整数を受け取るJavaScript関数を作成する必要があります。 この関数は、配列から余分な出現を削除し、処理後の配列内のどの要素も指定された回数(第2引数)より多く出現しないようにします。つまり、各要素の出現回数を上限値までに制限するのが目的です。 アプローチ この問題は、各要素の出現回数を記録するマップ(オブジェクト)を使うことで効率的に解決できます。手順は以下の通りです。 配列を走査し、各要素の出現回数をカウントします。ただし、カウントが指定された上限値に達したらそれ以上は増やしません。 カウント結果をもとに、各要素を許容回数だけ
-
JavaScriptで演算子の優先順位を考慮した数式評価を実装する方法
問題文字列として与えられた数式を受け取り、その計算結果を数値として返すJavaScript関数を作成します。この関数では、以下の数学演算子をサポートする必要があります。除算 /(浮動小数点除算として扱う)加算 +減算 -乗算 *演算子は常に左から右へ評価され、* と / は + と - よりも優先的に処理されなければなりません。また、単項マイナス(負数の扱い)にも対応しています。アルゴリズムのポイントこの実装では、有名な「操車場アルゴリズム(Shunting Yard Algorithm)」の考え方を利用しています。これは、中置記法(人間が普段書く数式の形式)の式を、コンピュータが評価しやすい
-
JavaScriptで配列要素をそのインデックスでべき乗した値に変換する方法
問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、入力配列の各要素を、その要素の位置を示す0始まりのインデックスでべき乗し、新しい配列へと変換します。そして最終的に、この新しい配列を返します。 例えば、インデックス0にある要素は0乗(常に1)、インデックス3にある要素は3乗、というように各要素が処理されます。 実装のポイント ループで配列を走査しながら、各要素とそのインデックスを同時に取得する Math.pow() を使って「要素 ^ インデックス」を計算する 計算結果を結果配列の同じ位置に格納する なお、モダンなJavaScriptでは Math
-
JavaScriptで数値配列の分散を計算する方法
問題昇順にソートされた数値の配列を受け取り、その分散(Variance)を計算するJavaScript関数を作成する必要があります。分散とは、一連の数値が平均値からどれだけばらついているかを表す統計量で、まず平均値を求め、その平均との差の二乗和をデータ数で割ることで計算できます。計算式まず、平均値(M)は次のように定義されます。$Mean (M) = ( \sum_{i=0}^{n-1} arr[i])$ / n続いて、分散(V)は各要素と平均値の差を二乗し、それらを合計してデータ数で割った値になります。Variance (V) = $(\sum_{i=0}^{n-1} (arr[i] - M
-
【JavaScript】奇数はそのまま、偶数のバイナリ文字列だけを昇順に並べ替える方法
問題 空白文字で区切られた、長さ3のバイナリ(2進数)文字列を含む文字列を受け取り、処理するJavaScript関数を作成します。 要件はシンプルながら少し変わっています。数値を昇順に並べ替えるのはよいものの、並べ替えてよいのは偶数だけで、奇数はすべて元の位置にそのまま残す必要があります。 コード例 以下が実際のコードです − const str = 101 111 100 001 010; const sortEvenIncreasing = (str = ) => { const sorter = (a, b) => { &nb