-
JavaScriptで配列内の先行・後続要素が両方存在する値を検索する方法
問題の概要 整数の配列を引数として受け取り、「その要素自身より1小さい値」と「1大きい値」がどちらも同じ配列内に存在する要素だけを抜き出して、新しい配列として返すJavaScript関数を作成してみましょう。 言い換えると、ある要素 num が結果の配列に含まれるのは、num - 1 と num + 1 の両方が元の配列に存在するとき、かつそのときに限られます。 入力例と出力例 たとえば、入力配列が次の通りだったとします。 const arr = [4, 6, 8, 1, 9, 7, 5, 12]; このとき、期待される出力は次のようになります。 const output = [ 6, 8,
-
JavaScriptでソート済み配列の過半数要素(マジョリティ要素)を判定する方法
過半数要素(Majority Element)とは?長さ l の配列 arr における「過半数要素」とは、l / 2 回より多く出現する要素のことです。この性質上、そのような要素は最大でも 1 つしか存在しません。ここでは、isMajority() という JavaScript 関数を作成します。この関数は第 1 引数として、常に昇順にソートされた配列 arr を受け取ります。第 2 引数には検索対象となる数値を渡し、その数値が過半数要素であれば true を、そうでなければ false を返します。たとえば、次のような配列と数値が与えられた場合を考えてみましょう。const arr = [5
-
JavaScriptで解く会議室スケジューリング問題 ― 時間の重複を検出する方法
問題の概要 ここでは、配列の中にさらに配列が格納されたデータ構造を扱います。各サブ配列は必ず2つの要素で構成されており、それぞれ会議の開始時刻と終了時刻を表しています。 私たちの関数に課せられたタスクは、1人の人が時間のコンフリクト(重複)を避けて出席できる会議を判定することです。具体的には、与えられたすべての会議に時間の重なりなく出席できる場合はtrue、そうでなければfalseを返します。 例として、会議の時刻を表す入力配列が次の場合を考えてみましょう。 const arr = [[5, 40], [10, 20], [25, 35]]; この場合、出力は次のようになります。 const
-
JavaScriptのsplit()を使って数値の全桁を2乗し連結する方法
本記事では、数値を引数として受け取り、その各桁を2乗して連結した新しい数値を返すJavaScript関数の作成方法を解説します。問題の概要作成する関数は、数値を最初かつ唯一の引数として受け取ります。そして、その数値のすべての桁をそれぞれ2乗し、結果を順番に連結して新しい数値として返す必要があります。例を見てみましょう。入力される数値が以下の場合:const num = 12349;期待される出力は次のとおりです:const output = 1491681;これは各桁の2乗である「1」「4」「9」「16」「81」を順に連結した結果です。1 + 4 + 9 + 16 + 81 = 1491681
-
JavaScriptで単語の入力にかかる時間を計算する方法
問題の概要ここでは、従来のQWERTY配列ではなく、キーが英語のアルファベット順(abcde...)にそのまま並んでいるキーボードを想定します。問題を解く前に、次の2つの前提条件を設けます。現在、指はインデックス0、つまり「a」のキー上に置かれている。あるキーから別のキーへの移動にかかる時間は、それぞれのインデックスの差の絶対値とする。例えば「a」から「k」への移動時間は |0 - 10| = 10 となる。求められているのは、英語の小文字アルファベットからなる文字列を引数に受け取り、その文字列を入力するのに必要な時間を計算して返すJavaScript関数です。入力例例えば、入力文字列が次の場
-
JavaScriptでアナグラム配列同士のインデックスをマッピングする方法
アナグラム配列とは ある配列の要素を並べ替えることで、もう一方の配列とまったく同じ並びを作れる場合、その2つの配列は「互いのアナグラム」であると言えます。 例えば、次のような関係です。 [1, 2, 3] と [2, 1, 3] は互いにアナグラムです。 ここで、互いにアナグラムの関係にある2つの配列 arr1 と arr2 が与えられたとします。 求められているのは、この2つの配列を受け取り、arr1 と同じ長さの新しい「マッピング配列」を返すJavaScript関数です。マッピング配列には、arr1 の各要素が arr2 のどのインデックス位置に存在するかを格納します。 入力例 例えば、
-
JavaScriptで昇順ソートされた3つの配列の共通要素(積集合)を効率的に求める方法
はじめに本記事では、JavaScriptを使って「昇順にソートされた3つの整数配列」を受け取り、その3つすべてに存在する要素だけを抽出した新しい配列を構築して返す関数の実装方法を解説します。配列がそれぞれソート済みであるという前提を活かせば、全件を比較する非効率な方法ではなく、3つのポインタ(インデックス)を同時に進めていく三方向マージ的な手法で、線形時間 O(n) で共通要素を見つけることができます。問題の概要要件は以下のとおりです。引数として、昇順にソートされた整数の配列を3つ受け取る3つの配列すべてに出現する要素のみを含む配列を返す入力例const arr1 = [4, 7, 8, 11
-
【JavaScript】4つの座標点から正方形を判定するアルゴリズム
問題の概要 JavaScriptで、4つの引数を受け取る関数 validSquare を作成することを目標とします。各引数は「数値2つからなる配列」であり、平面上の四角形(または閉じた・開いた任意の図形)の4つの頂点座標を表しています。 この関数の役割は、与えられた4つの頂点が正方形を形成しているかどうかを判定することです。正方形であれば true を、そうでなければ false を返します。 入力例 const c1 = [1, 0]; const c2 = [-1, 0]; const c3 = [0, 1]; const c4 = [0, -1]; 出力例 const output =
-
JavaScriptで2進数配列に含まれる連続する「1」の最大長を求める方法
問題の概要JavaScriptで、0と1のみから構成されるバイナリ配列(2進数配列)を引数として受け取り、その中で「1」が連続している部分配列の最大の長さを返す関数を作成する必要があります。例えば、入力配列が以下の場合を考えてみましょう。const arr = [1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1];この場合、最も長く連続する「1」は4つあるため、出力は次のようになります。const output = 4;解決アプローチ:スライディングウィンドウ法この問題はスライディングウィンドウ(尺取り法)というアルゴリズムを使うことで効率的に解けます。これは、
-
JavaScriptで配列の全要素を等しくするための最小操作回数を求める方法
問題の概要 数値 num を唯一の引数として受け取るJavaScript関数を作成する必要があります。この関数はまず、次のルールに基づいて n 個の要素からなる配列を構築します。 arr[i] = (2 * i) + 1; たとえば、入力が 5 の場合、生成される配列は以下のようになります。 const arr = [1, 3, 5, 7, 9]; この関数の目的は、配列内のすべての要素を等しくするために必要な最小の操作回数を計算して返すことです。 「1ステップ」の定義 ここでいう1つの有効な操作とは、配列から異なる2つの数値を選び、片方に +1 を加算し、もう片方から -1 を減算することを
-
JavaScriptで配列から偶数桁の数値を抽出する方法
整数の配列を受け取り、その中から「桁数が偶数」である要素だけを集めた新しい配列を返すJavaScript関数を作成してみましょう。この処理は、数値を文字列に変換してその長さを調べるというアプローチで、非常にシンプルに実装できます。 問題の概要 今回の課題は、第一引数(かつ唯一の引数)として整数の配列を受け取る関数を実装することです。関数は、元の配列のうち桁数が偶数(2桁、4桁など)である要素のみを含む新しい配列を構築して返します。元の配列自体は変更しない点がポイントです。 具体例 たとえば、入力配列が次の場合: const arr = [12, 6, 123, 3457, 234, 2]; 期
-
JavaScriptで各生徒の上位n件の得点平均を求める方法
問題の概要 次のような、生徒のID(id)と一定期間に記録された得点(score)を保持するオブジェクトの配列があるとします。 const marks = [ { id: 231, score: 34 }, { id: 233, score: 37 }, { id: 231, score: 31 }, { id: 233, score: 39 }, { id: 231, score: 44 }, { id: 233, score: 41 }, { id: 231, score: 38 }, { id: 231, score: 31 }, { id: 233,
-
JavaScriptでスライディングウィンドウを使って連続する数値の平均を効率的に計算する方法
整数の配列 arr を第1引数に、数値 num(arr.length 未満)を第2引数として受け取る JavaScript 関数を作成する必要があります。この関数は、配列内に存在するすべての「連続する num 個の要素」の平均を格納した新しい配列を構築して返します。 例 たとえば、入力が次のような場合を考えてみましょう。 const arr = [1, 2, 3, 4, 5]; const num = 2; このとき、期待される出力は次の通りです。 const output = [1.5, 2.5, 3.5, 4.5]; これは、サイズ 2 の連続するウィンドウが (1, 2)、(2, 3)、
-
JavaScriptでパスワードを検証する方法|バリデーション関数の実装例
本記事では、パスワード文字列を唯一の引数として受け取り、その妥当性を判定するJavaScript関数の作成方法を解説します。ユーザー登録フォームなどで「一定のセキュリティ基準を満たしたパスワードかどうか」をプログラムでチェックしたい場合に役立つ内容です。 作成する関数は、渡されたパスワード文字列が以下のすべての条件を満たす場合に true を返します。 文字数: 6文字以上20文字以下であること 数字: 数字(0〜9)を少なくとも1つ含むこと 英小文字: 小文字のアルファベットを少なくとも1つ含むこと 英大文字: 大文字のアルファベットを少なくとも1つ含むこと 特殊文字: 特殊文字(!@#$
-
JavaScriptで部分列の組み合わせから文字列を作れるか判定する方法
問題の概要JavaScriptで、2つの文字列(第一引数をstr1、第二引数をstr2と呼びます)を受け取る関数を書くことを考えてみましょう。この関数の目的は、str1の中に部分列(subsequence)としてstr2が含まれているかどうかを判定することです。ここでいう部分列とは、元の文字列からいくつかの文字をスキップすることは許されるが、選び出した文字同士の並び順は維持しなければならないというルールのもとで組み合わせた文字列のことです。具体例たとえば、入力として次のような文字列が与えられたとします。const str1 = desxooajmepwele; const str2 = exa
-
JavaScriptで文字列がパングラムかどうかを判定する方法
パングラムとは パングラム(pangram)とは、英語のアルファベット26文字すべてを少なくとも1回ずつ含む文字列のことです。有名な例として「The quick brown fox jumps over the lazy dog」が挙げられます。 本記事では、文字列を第1引数として受け取り、その文字列がパングラムであるかどうかを判定するJavaScript関数を作成します。なお、この問題では小文字のアルファベットのみを考慮します。 実装例 実際のコードは以下のとおりです。 const str = We promptly judged antique ivory buckles for the
-
JavaScriptで文字列の重みを計算する方法
アルファベット1文字の「重み」とは?英語のアルファベットにおける「重み」とは、その文字がアルファベットの中で何番目に位置するかを示す、1から始まるインデックスのことです。たとえば、「c」は3番目なので重みは3、「k」は11番目なので重みは11となります。この記事では、小文字の文字列を受け取り、その文字列全体の重みを計算して返すJavaScript関数を作成します。実装例実際のコードは以下のとおりです。const str = this is a string; { str = str.toLowerCase(); &
-
JavaScriptで「美しい数値文字列」を判定する方法を解説
数値のみで構成された文字列 str が「美しい文字列(Beautiful String)」であるとは、その文字列を2つ以上の正の整数からなるシーケンス arr に分割でき、かつ次の条件をすべて満たすことを指します。 連続する整数であること: 任意のインデックス i に対して arr[i] − arr[i − 1] = 1 が成り立つこと。つまり、シーケンス内の各要素は必ず直前の要素よりちょうど1大きくなければなりません。 先頭に0を含まないこと: シーケンスのどの要素にも先行ゼロ(leading zero)があってはなりません。たとえば、50607 を [5, 06, 07] と分割するこ
-
JavaScriptで文字列の最小削除回数を求める方法
問題の概要例えば、次のようなバイナリ文字列(「0」と「1」だけで構成された文字列)があるとします。const str = 001001;私たちの課題は、このような文字列を唯一の引数として受け取るJavaScript関数を作成することです。関数の役割は、入力された文字列に対して隣り合う2つの文字が同じにならないようにするために必要な最小削除回数を計算し、その結果を返すことです。例えば、上記の文字列の場合、出力は次のようになります。const output = 2;これは、インデックス0と3にある「0」を削除すると、新しい文字列が「0101」となり、隣接する文字がすべて異なる最長の文字列になるため
-
JavaScriptの配列から合計が指定値になる3つの要素を見つける方法
本記事では、第1引数として数値の配列を、第2引数として単一の数値を受け取るJavaScript関数の実装方法を解説します。この関数は、配列の中から合計が第2引数で指定した数値と等しくなるような3つの要素を取り出します(該当する組み合わせが存在する場合)。最終的に、関数は条件を満たすすべてのトリプレット(3つの組)を「配列の配列」として返し、該当する組み合わせがひとつも存在しない場合には空の配列を返します。入力例と出力例たとえば、入力の配列と目標となる合計値が以下であるとします。const arr = [2, 5, 7, 8, 9, 11, 1, 6];const sum = 22;この場合、期