JavaScriptで指定範囲内の連続数字をすべて見つける方法
連続数字(Sequential Digits)とは?
「連続数字」とは、数値の各桁がひとつ前の桁よりもちょうど1大きくなっている数のことです。たとえば 1234、5678、12345 のように、左から右へ向かって数字が順番に増えていくという特徴を持ちます。
問題の定義
今回は、範囲を指定する2つの要素からなる配列 arr を引数として受け取るJavaScript関数を作成します。
この関数は、指定された範囲内(両端を含む)に存在する連続数字の整数をすべて抽出し、昇順に並べ替えた配列として返す必要があります。
たとえば、次のような入力が与えられた場合を見てみましょう。
const arr = [1000, 13000];
このときの出力は次のようになります。
const output = [1234, 2345, 3456, 4567, 5678, 6789, 12345];
実装コード
この問題を解決するためのコードは以下のとおりです。
const arr = [1000, 13000];
const sequentialDigits = ([low, high] = [1, 1]) => {
const findCount = (num) => {
let count = 0;
while(num > 0){
count += 1
num = Math.floor(num / 10)
};
return count;
};
const helper = (count, start) => {
let res = start;
while(count > 1 && start < 9){
res = res * 10 + start + 1;
start += 1;
count -= 1;
};
if(count > 1){
return 0;
};
return res;
};
const count1 = findCount(low);
const count2 = findCount(high);
const res = [];
for(let i = count1; i <= count2; i++){
for(let start = 1; start <= 8; start++){
const num = helper(i, start);
if(num >= low && num <= high){
res.push(num);
};
};
};
return res;
};
console.log(sequentialDigits(arr));
コードの解説
このコードは、主に次の3つのパートで構成されています。
- findCount(num):数値の桁数をカウントする補助関数です。10で割り続けることで、対象の数値が何桁かを求めます。
- helper(count, start):開始数字 start から始めて、count 桁分の連続数字を組み立てる関数です。桁が9を超えてしまう場合は0を返し、無効な候補として扱います。
- メイン処理:範囲の下限と上限それぞれの桁数を求め、考えられるすべての「桁数 × 開始数字」の組み合わせに対して連続数字を生成し、範囲内に収まるものだけを結果配列に追加していきます。
このアプローチにより、範囲内の全数値を1つずつ総当たりで調べる必要がなく、効率的に該当する数だけを列挙できます。
出力結果
コンソールには次のように出力されます。
[ 1234, 2345, 3456, 4567, 5678, 6789, 12345 ]
-
JavaScriptで指定した範囲内にある「ある数で割り切れる数」の個数を求める方法
問題2つの整数からなる範囲(配列)を第1引数に、1つの数値を第2引数として受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲内に存在する「入力された数値で割り切れる数」をすべて見つけ、その合計個数を返します。サンプルコード以下がその実装例です。const range = [6, 57]; const num = 3; const findDivisibleCount = (num = 1, [l, h]) => { let count = 0; for(let i = l; i <= h; i++
-
JavaScriptで指定範囲内の数値の立方和を計算する方法
問題今回は、2つの数値からなる範囲配列を受け取り、その範囲内に含まれるすべての数値の立方数(3乗した値)を合計して返すJavaScript関数を作成します。たとえば、範囲が [4, 11] の場合、4³ から 11³ までの合計を求めることになります。解決のアプローチこの問題は次の手順で解くことができます。範囲の下限から上限まで、順番に各数値を取り出す取り出した数値を3乗する3乗した値を累積し、最終的な合計を返すコード例実際の実装コードは以下の通りです。const range = [4, 11]; const sumCubes = ([l, h]) => { const find