-
JavaScriptのビット演算で2の累乗かどうかを判定する方法
はじめに本記事では、数値を受け取り、それが2の累乗であるかどうかを判定するJavaScript関数の作成方法を解説します。期待する動作は以下のとおりです。f(23) → false f(16) → true f(1) → true f(1024) → trueアプローチ:2進数の性質を利用する2の累乗を2進数で表すと、必ず立っているビット(1)が1つだけになるという特徴があります。1: 0001 2: 0010 4: 0100 8: 1000この性質を利用すると、以下のビット演算のテクニックで判定が可能です。num & (num - 1)この式は、numと「numから1を
-
JavaScriptで正規表現マッチングを実装する方法 ― 「.」と「*」を動的計画法で処理する
入力文字列 str とパターン p が与えられたとき、「.」と「*」をサポートする正規表現マッチングを実装することを考えます。各記号の役割は以下のとおりです。. → 任意の1文字にマッチします。* → 直前の要素の0回以上の繰り返しにマッチします。なお、マッチングは入力文字列の全体に対して成立しなければなりません(部分一致ではありません)。前提条件str は空文字列の可能性があり、含まれるのは小文字の a〜z のみです。p は空文字列の可能性があり、含まれるのは小文字の a〜z、および「.」や「*」などの記号のみです。例たとえば、入力が次の場合を考えます。const str = aa;cons
-
JavaScriptで文字列に含まれる数字を抽出して数値として返す方法
JavaScriptでは、文章の中に数字が埋め込まれている文字列を扱う場面に出会うことがあります。本記事では、文字列を受け取ってその中の数字だけをすべて抜き出し、ひとつの数値として返す関数の実装方法を解説します。要件引数として文字列(数字が埋め込まれている可能性がある)を受け取る文字列内の数字をすべて抽出し、出現順に連結した数値を返す数字が1つも含まれていない場合は 0 を返すサンプルコードconst str = sfsd8fsdf6dsfsd8sdfs28fd0;const pickNumbers = (str = ) => { let res = 0; 
-
【JavaScript】文字の並べ替えなしで、一方の文字列から一部の文字を削除してもう一方の文字列を形成できるか判定する方法
課題 JavaScriptで、2つの文字列(str1 と str2)を引数として受け取る関数を実装します。この関数は、str1から一部の文字を削除することでstr2を形成できるかどうかを判定します。ただし、文字の並び順を一切変えてはいけないという条件が付きます。 言い換えれば、これは「str2 が str1 の部分列(サブシーケンス)であるか」を調べる問題です。使用する文字の種類や数が揃っているだけでは不十分で、出現順序まで一致している必要がある点がポイントです。 入力例 const str1 = sjkfampeflef; const str2 = sample; この場合、sample の
-
JavaScriptで配列から3つの数値の最大積を求める方法
JavaScriptで、数値の配列を引数として受け取る関数を作成することを考えます。この関数は、配列内の任意の3つの要素の組み合わせの中で最も大きな積となる3つの要素を選び出し、その積を返すものとします。 例 入力配列が次の場合を考えてみましょう。 const arr = [-10, 7, 29, 30, 5, -10, -70]; このとき、期待される出力は次のとおりです。 const output = 21000; これは、選ばれる3つの数値が「30」「-10」「-70」であり、30 × (-10) × (-70) = 21000 となるためです。 アプローチのポイント:負の数への対応 こ
-
JavaScriptで配列内の要素間の最大差を求める方法(順序条件付きの効率的手法)
問題の概要数値の配列を受け取るJavaScript関数を作成します。この関数は、配列内の要素同士の差のうち最大となるものを見つけ出す必要があります。ただし、重要な条件が1つあります。それは「小さい方の要素は、元の配列において大きい方の要素より前に出現しなければならない」という制約です。例次のような数値の配列を考えてみましょう。const arr = [2, 5, 6, 12, 1];この配列に対して、関数は 10 を返す必要があります。一見すると、配列の最大値と最小値はそれぞれ 12 と 1 なので、その差である 11 が答えに思えるかもしれません。しかし、1 は 12 よりも後ろに出現してい
-
JavaScriptで各要素が全要素の積になる配列を構築する方法
JavaScriptで「各要素が全要素の積」となる配列を構築する 数値の配列を受け取り、それをもとに新しい配列を構築するJavaScript関数を作成します。新しい配列の各要素には、その位置の要素自身を含む元の配列すべての要素の積が格納されます。 例 入力配列が次のとおりだった場合: const arr = [1, 2, 3, 4, 5]; 期待される出力は次のとおりです。 const output = [120, 60, 40, 30, 24]; これは、配列全体の積が 1 × 2 × 3 × 4 × 5 = 120 であるためです。各位置の値は「全体の積 ÷ その位置の要素」で求められます
-
JavaScriptで2つの配列の一意な共通要素(積集合)を抽出する方法
本記事では、2つの数値の配列(arr1 と arr2)を受け取り、両方の配列に存在する共通要素、つまり「積集合」に相当する要素を取り出す JavaScript の関数を作成します。重要な条件がひとつあります。それは、一度共通要素として検出した値は、その後どちらの配列に再び現れたとしても、二度と結果に含めてはいけないという点です。つまり、結果には重複のない一意な共通要素のみを格納する必要があります。入力と出力の例たとえば、次のような入力配列が与えられた場合を考えてみましょう。const arr1 = [1, 5, 7, 3, 1]; const arr2 = [1, 7, 3, 1, 6];この
-
【JavaScript】reverse()を使わずに文字列の単語の並びを逆順にする方法
概要JavaScriptで、文字列を唯一の引数として受け取る関数を作成することを考えます。この関数は、文字列内の単語の並び順を逆にして、新しい文字列として返す必要があります。ただし、重要な条件がひとつあります。それは、組み込みの配列メソッドである reverse() を使用してはいけないという点です。例たとえば、入力文字列が次の場合:const str = this is a string;期待される出力は次のとおりです:string a is this実装コード以下が実際のコード例です:const str = this is a string; const reverseWordOrder
-
JavaScriptの再帰関数で10進数から2進数への変換を実装する方法
概要数値を唯一の引数として受け取り、その数値を2進数表記に変換した文字列を返すJavaScript関数を作成します。本記事では、ループ処理ではなく再帰(recursion)を使った実装方法をわかりやすく解説します。期待する動作は以下のとおりです。f(4) = 100f(1000) = 1111101000f(8) = 1000サンプルコードconst decimalToBinary = (num) => { if(num >= 1) { // 奇数の場合:(num - 1) / 2 に対して再帰呼び出しを行い、&n
-
JavaScriptのdelete演算子を配列に使うと起こる厄介な挙動
JavaScriptにおけるdelete演算子は、本来オブジェクトのプロパティを削除するための演算子です。しかし、JavaScriptでは配列も「インデックスをキーとしたオブジェクト」の一種として扱われるため、実は配列に対してもdelete演算子を使用することができます。ここで問題なのが、この使い方によって予想外の挙動が引き起こされるという点です。実際に見ていきましょう。サンプルコードまず、次のような配列リテラルを用意します。const arr = [a, b, c, d, e];この配列の末尾の要素(インデックス4)をdeleteで削除してみます。実行結果を予想しながら、以下のコードをご覧く
-
JavaScriptで配列の交互要素(1つおきの要素)の合計を求める方法
交互要素の合計とは本記事では、数値の配列を唯一の引数として受け取り、配列内の交互の要素(インデックスが偶数の位置にある要素)の合計を計算して返すJavaScript関数の実装方法を解説します。例えばー入力配列が以下の場合を考えてみましょう。const arr = [1, 2, 3, 4, 5, 6, 7];この場合、出力は次のようになります。1 + 3 + 5 + 7 = 16サンプルコード以下が実際の実装コードです。const arr = [1, 2, 3, 4, 5, 6, 7]; const alternativeSum = (arr = []) => {  
-
JavaScriptで西暦年から世紀を取得する方法
本記事では、数値または文字列として与えられた西暦年を受け取り、その年が属する世紀を計算して返すJavaScript関数の作成方法を解説します。 期待される動作 作成する関数は、次のように年を渡すと対応する世紀の番号を返します。 f("2000") = 20 f(1999) = 20 f("2002") = 21 2000年と1999年はどちらも20世紀(1901年〜2000年)に属し、2002年は21世紀に属します。世紀の区切りは「1年〜100年=1世紀」「101年〜200年=2世紀」というルールに従うため、単純に年を100で割るだけでは正しく求められな
-
JavaScriptで2つの文字列に共通する文字数を数える方法
問題の概要今回は、2つの文字列(str1 と str2)を受け取り、両方の文字列に共通して存在する文字の数を数える JavaScript 関数を作成します。ここでいう「共通する文字数」とは、同じ文字が両方の文字列に出現する回数を、出現回数の少ない方に合わせてカウントしたものです。例:const str1 = aabbcc; const str2 = adcaa;この場合、出力は 3 になります。str1 の a は2つ、str2 の a は3つあるため共通する a は2つ。さらに c は str1 に2つ、str2 に1つあるため共通する c は1つ。合計で 2 + 1 = 3 となります。実
-
JavaScriptで2つの数値を受け取り整数の大小関係を比較する方法
JavaScriptでは、2つの数値(例えば num1 と num2)を受け取り、それらの大小関係を判定する関数を作成できます。この関数は以下のように動作します。num1 が num2 より大きい場合、「greater」(大きい)を返します。num2 が num1 より大きい場合、「smaller」(小さい)を返します。どちらでもない場合(つまり2つの数値が等しい場合)は、「equal」(等しい)を返します。実装例以下がそのコードです。const compareIntegers = (num1, num2) => { if(typeof n
-
JavaScriptで文字列が指定した文字で終わっているかどうかを判定する方法
本記事では、第一引数に文字列、第二引数に一つの文字を受け取るJavaScript関数の作成方法を解説します。この関数は、第一引数で指定された文字列が、第二引数で指定された文字で終わっているかどうかを判定します。ただし、ES6以降のメソッドや外部ライブラリを使用せずに実装することが条件です。実装コード以下がそのコード例です。 { const { length } = str; return str[length - 1]; }; return getLast(str) === char; }; console.log(checkEnding(str, g)) consol
-
JavaScriptで配列から指定した数に最も近い値を取得する方法
はじめに本記事では、JavaScriptを使って「配列の中から指定した数値に最も近い値を見つけて返す」関数の実装方法を解説します。この関数は、第1引数として数値の配列を、第2引数として単一の数値を受け取ります。そして、配列の中から第2引数で指定された数値に最も近い要素を探し出し、その値を返します。問題の例例えば、以下のような配列と数値が与えられた場合を考えてみましょう。const arr = [34, 67, 31, 53, 89, 12, 4]; const num = 41;この場合、41に最も近い配列の要素は 34 となるため、出力結果は 34 になります。実装コード以下が実際のコード例
-
JavaScriptで配列内に合計値が存在する数値ペアを見つける方法
今回は、数値の配列を受け取るJavaScript関数を作成します。この関数は、異なるインデックス(連続しているかどうかは問わない)にある2つの数値を選び、その合計値も同じ配列内に存在するようなペアを見つけて返す必要があります。例えば、[1, 3, 5, 6, 8, 9] という配列の場合、「5」と「1」のペアは合計が「6」になり、この6は配列内に存在するため、有効なペアとして返されます。サンプルコード以下が実際のコードです。const arr = [1, 3, 5, 6, 8, 9]; const findPair = (arr = []) => {
-
【JavaScript】数値の約数をすべて求める関数の実装方法
はじめに本記事では、正の整数を1つ引数として受け取り、その数を余りなく割り切れるすべての数(約数)を配列として返すJavaScript関数の実装方法を解説します。問題の定義作成する関数は、正の整数を唯一の引数として受け取ります。そして、入力された数値を完全に割り切れるすべての数値を要素とする配列を構築して返す必要があります。例えばー入力が次の数値だった場合:const num = 12;期待される出力は以下のとおりです。const output = [1, 2, 3, 4, 6, 12];12の場合、1・2・3・4・6・12の6つの整数が12を割り切れるため、これらが約数となります。実装コード
-
JavaScriptでソートされていない配列から最大値と最小値を線形時間で求める方法
はじめにJavaScriptでは、ソートされていない数値の配列から最大値と最小値を効率的に取り出したいケースがよくあります。本記事では、線形時間(O(n))かつ定数領域(O(1))で動作する関数を実装し、最小値(min)と最大値(max)を含むオブジェクトとして返す方法を解説します。実装の考え方アプローチは非常にシンプルです。まず配列の先頭要素を最大値・最小値の初期値として設定し、その後、配列全体を一度だけ走査します。走査中に現在の最大値より大きい要素が見つかれば最大値を更新し、現在の最小値より小さい要素が見つかれば最小値を更新していきます。これにより、配列をソートすることなく1回のループで両