-
JavaScriptで文字列内の母音の数を数える方法
文字列を受け取るJavaScript関数を作成する必要があります。この関数は、文字列に含まれる母音(a、e、i、o、u)の数を数え、各母音とその出現回数を対応付けたオブジェクトとして返すものです。 実装コード 以下がそのコード例です。 { if (vowels.indexOf(letter.toLowerCase()) !== -1) { if (letter in obj) { obj[letter]++; } else { obj[letter] = 1;
-
【JavaScript】配列内で指定した値に最も近い要素のインデックスを取得する方法
問題の概要JavaScriptで、数値の配列を第一引数、単一の数値(ターゲット値)を第二引数として受け取る関数を作成することを考えます。この関数の役割は、配列内の要素の中から第二引数で指定された値に最も近い要素を見つけ出し、そのインデックスを返すことです。実装例実際のコードは以下の通りです。 { let min; let chosen = 0; for (let i in arr) { &nb
-
JavaScriptで最初の配列と2番目の配列の違い(差分)を抽出する方法
JavaScriptでは、リテラル値を含む2つの配列を受け取り、1番目の配列には存在するが、2番目の配列には存在しない要素だけを集めた新しい配列を返す関数が必要になることがあります。2つの配列には、まったく同じ要素が含まれている場合もあります。そのため、各要素を順番に比較し、2番目の配列に含まれていないものだけを結果として収集する処理を実装します。実装のポイント基本的な流れは以下のとおりです。1番目の配列を先頭から順番にループで走査する各要素が2番目の配列に含まれるかどうかを Array.prototype.includes() で判定する含まれていない要素だけを結果用の配列に追加するサンプル
-
JavaScriptで最も長い非共通部分列(LUS)を見つける方法
文字列の配列を受け取り、その中から最長非共通部分列(Longest Uncommon Subsequence)を見つけるJavaScript関数を作成する必要があります。ここで「最長非共通部分列」とは、配列内のいずれか1つの文字列の部分列でありながら、他のどの文字列の部分列としても現れない、最長の部分列のことを指します。この関数は、そのような最長非共通部分列の長さを返す必要があります。問題の例例えば、入力配列が次のようになっているとします。const arr = ["aba", "cdc", "eae"];この場合、出力は 3 になり
-
JavaScriptで括弧の組み合わせが有効かどうかを判定する方法
問題の概要 文字列 str を引数として受け取り、その文字列に含まれるのが (・)・{・
-
JavaScriptで再帰を使って配列内の全要素の積を求める方法
概要整数の配列を受け取り、その中のすべての要素の積を計算するJavaScript関数を作成する必要があります。この関数には、次の2つの要件が課せられています。再帰的なアプローチを利用すること配列内のすべての要素の積を計算し、その結果を返すこと具体例たとえば、入力として次の配列が与えられた場合を見てみましょう。const arr = [1, 3, 6, .2, 2, 5];このとき、期待される出力は次のとおりです。const output = 36;実際、1 × 3 × 6 × 0.2 × 2 × 5 = 36 となるため、この結果が正しいことが確認できます。コード例この処理を実現するコードは次
-
JavaScriptで英単語から押されたテンキーの番号を検索する方法(電話番号問題の逆)
かつてのテンキー式携帯電話では、数字とアルファベットは以下のように対応付けられていました。 const mapping = { 1: [], 2: [a, b, c], 3: [d, e, f], 4: [g, h, i], 5: [j, k, l], 6: [m, n, o], 7: [p, q, r, s], 8: [t, u, v], 9: [w, x, y, z] }; 本記事では、このマッピングを利用して、アルファベット文字列を受け取り、その文字列を入力するために押すべき数字の組み合わせを返すJavaScript
-
JavaScriptで2つの文字列がアナグラムかどうかを判定する方法
アナグラムとはアナグラム(anagram)とは、一方の文字列に含まれる文字を並べ替えたり組み替えたりすることで、もう一方の文字列とまったく同じ文字列を作り出せる関係を指します。例えば、「something」と「emosghtin」は互いにアナグラムの関係にあります。本記事では、2つの文字列 str1 と str2 を受け取り、両者がアナグラムであれば true、そうでなければ false を返すJavaScript関数を実装します。判定のアプローチアナグラムかどうかを効率的に判定するには、次の手順が有効です。まず、両者の文字列の長さが異なる場合は、その時点でアナグラムではないと判断できます。次
-
JavaScriptで隣接しない要素から最大合計の部分集合を求める方法
整数の配列を受け取り、その中から互いに隣接していない要素で構成される部分集合のうち、合計が最大になるものを見つけるJavaScript関数を作成する必要があります。 そして最終的に、その部分集合の合計を計算して返します。 問題の例 例えば、入力配列が以下の場合を考えてみましょう。 const arr = [3, 5, 7, 8, 10]; この場合の出力は 20 になります。これは、隣接しない要素で構成される部分集合として「3, 7, 10」を選んだとき、その合計が 20 となり、これが最大となるためです。 サンプルコード const arr = [3, 5, 7, 8, 10]; const
-
【JavaScript】文字列が配列内の文字列の組み合わせで構成できるか判定する方法
概要 本稿では、第1引数に文字列の配列、第2引数に判定対象の文字列を受け取るJavaScript関数を作成します。この関数は、第2引数の文字列が、配列内の文字列を任意の順序で組み合わせることで完全に構成できる場合に true を返すものです。 まず、具体的な例を見てみましょう。入力となる配列が次の通りです。 const arr = [for, car, keys, forth]; そして、判定対象の文字列がこちらです。 const str = forthcarkeys; この場合、出力は true になります。「forthcarkeys」という文字列は、配列のインデックス3の「forth」、イ
-
JavaScriptで複数の文字配列から重複文字なしの全組み合わせ文字列を生成する方法
問題の概要 単一文字だけを要素とする配列が n 個あるとします。ここでは、それらの配列をすべて引数として受け取り、条件に合う文字列を生成するJavaScript関数を作成します。 関数が返すべき文字列は、次の2つの条件を満たす必要があります。 各配列からちょうど1文字ずつ取り出して構成されていること 同じ文字が2回以上登場しないこと(配列同士に共通の文字が含まれる可能性があるため) 本記事では説明のために3つの配列を使用しますが、実装する関数は配列の個数が変わっても正しく動作するよう設計します。 サンプルデータ const arr1 = [a, b, c, d]; const arr2
-
バニラJavaScriptでヒープソートを実装する方法をわかりやすく解説
ヒープソートとはヒープソートは、要素同士を比較しながら並べ替える「比較ベースのソートアルゴリズム」の一つです。選択ソートの改良版と考えることができます。選択ソートと同様に、入力データを「ソート済み領域」と「未ソート領域」に分割し、未ソート領域から目的の要素(最大値または最小値)を取り出してソート済み領域へ移動させる、という処理を繰り返すことで未ソート領域を少しずつ縮小していきます。ヒープソートの最大の特徴は、二分ヒープ(バイナリヒープ)というデータ構造を利用する点です。ヒープを構築することで最大値(または最小値)を効率的に取り出せるため、平均・最悪どちらのケースでも計算量が O(n log n
-
JavaScriptのスタックを使った逆ポーランド記法(RPN)計算機の実装方法
逆ポーランド記法(RPN)計算機とはJavaScriptのスタック(Stack)データ構造を活用して、RPN(Reverse Polish Notation:逆ポーランド記法)入力方式の計算機を作成する方法を解説します。逆ポーランド記法は演算子を被演算子の後ろに置く記法で、括弧が不要になり、スタックを使った実装と非常に相性が良いのが特徴です。入力配列の例まず、次のような入力配列を考えてみましょう。const arr = [1, 5, +, 6, 3, -, /, 7, *];処理の流れ1 はオペランド(被演算子)なので、スタックにプッシュします。5 はオペランドなので、スタックにプッシュします
-
JavaScriptでスタックの要素を再帰的に並べ替える方法
はじめに本記事では、整数の配列(スタックとして扱う)を受け取り、再帰処理とpush・popメソッドのみを使って、その配列をその場(in-place)で昇順に並べ替えるJavaScript関数を実装する方法を解説します。このアルゴリズムのポイントは、以下の2つの再帰関数を組み合わせる点にあります。sortStack:スタックから要素を1つずつ取り出し(pop)、残りのスタックを再帰的に並べ替えてから、要素を適切な位置に挿し戻します。sortedInsert:指定した要素を、スタックが空になるか、スタック末尾の要素より大きくなるまで再帰的にpopし、正しい位置に挿入します。サンプルコード実際のコー
-
JavaScriptで数値(0〜25)を対応するアルファベットに変換する方法
本記事では、0から25までの整数(両端を含む)を引数として受け取り、その数値に対応するアルファベット1文字を返すJavaScript関数の作成方法を解説します。仕様の概要たとえば、0 を渡せば A、25 を渡せば Z が返されるイメージです。この変換は、ASCIIコード(文字コード)を利用するとシンプルに実装できます。実装コード以下が実際のコード例です。const num = 15; { // 大文字「A」のASCIIコード値を取得 const A = A.charCodeAt(0); // 数値を文字に変換する内部関数 { return String.from
-
JavaScriptで解く「表現豊かな単語」問題:文字列の伸縮判定アルゴリズム
人は感情を強調するために、同じ文字を繰り返して使うことがあります。例えば「hello」→「heeellooo」、「hi」→「hiiii」のような変換です。「heeellooo」のような文字列には、「h」「eee」「ll」「ooo」といった、同じ文字が連続して並ぶグループが存在します。ある文字列 S に対して、クエリとなる単語が「伸縮可能(stretchy)」であるとは、次の拡張操作を何度か適用することで、その単語を S と一致させられることを意味します。拡張操作: 文字 c からなるグループを選び、そこに文字 c を追加して、グループのサイズを 3 以上にする。例えば、「hello」からスター
-
JavaScriptで解く!エンコードされたメッセージのデコード可能な組み合わせ数を求めるアルゴリズム
アルファベットを a = 1、b = 2、…、z = 26 という対応関係で数値にマッピングすることを考えます。ここで、あるエンコードされたメッセージが与えられ、そのメッセージをデコードできる方法が何通りあるかを数えるJavaScript関数を作成する必要があります。例えば、メッセージ「111」の場合、答えは 3 になります。これは次の3通りにデコードできるためです。1・1・1 → a・a・a(「aaa」)11・1 → k・a(「ka」)1・11 → a・k(「ak」)サンプルコードこの問題を解くコードは以下の通りです。const waysToProcess = ( message, ways
-
JavaScriptでアルファベットを前後反転する方法(a⇔zの対応文字を取得する関数)
はじめに JavaScriptで、1文字のアルファベットだけを引数として受け取る関数を実装します。この関数は、渡された文字が「先頭(a)から数えて何番目」にあるのかを計算し、同じ位置を末尾(z)側から数えた文字を返します。 具体的には、「a」→「z」、「b」→「y」、「c」→「x」のように、アルファベットを前後で鏡合わせにした対応関係(古典暗号のアトバシュ暗号と同じ考え方)を作る処理です。 実装例 まずは、アルファベットを前半13文字と後半13文字に分割して対応付けるシンプルなアプローチを見てみましょう。 const alpha = g; const findCounterPart = (
-
JavaScriptで母音を大文字化し、各文字を次のアルファベットに置き換える方法(z→a)
はじめにJavaScriptでは、文字列を引数として受け取り、特定のルールに従って新しい文字列を生成する関数を簡単に作成できます。本記事では、「すべての母音を大文字にし、かつ各アルファベットをその次の文字へ置き換える(zの場合はaへ折り返す)」という処理を実現する関数の実装方法を解説します。要件の確認今回作成するのは、以下の条件を満たすJavaScript関数です。入力として文字列を1つだけ受け取る母音(a, e, i, o, u)は大文字に変換するそれ以外のアルファベットは、対応する次のアルファベットへ置き換える(例:z → a)実行例たとえば、次の文字列を入力した場合を見てみましょう。co
-
JavaScriptで2つの配列を1つのオブジェクトのキーと値のペアとしてまとめる方法
JavaScriptでは、同じ長さの2つの配列があったとき、一方を「キー」、もう一方を「値」として扱い、それらを組み合わせて1つのオブジェクトを作りたい場面があります。例えば、次のように同じ長さの2つの配列があるとします。const arr1 = [firstName, lastName, age, address, isEmployed]; const arr2 = [Rahul, Sharma, 23, Tilak Nagar, false];この場合、arr1 の各要素をプロパティ名(キー)として、対応する arr2 の要素をその値に割り当てたオブジェクトを生成する関数が必要です。つまり