JavaScriptで配列内の紛らわしい数(Confusing Number)を見つける方法
紛らわしい数(Confusing Numbers)とは?
配列内のある数値が「紛らわしい数」とみなされるのは、その数値を上下左右に180度回転した結果が、同じ配列内に存在する別の数値になる場合です。たとえば、6を180度回転すると9になり、逆に9を回転すると6になります。
ただし注意が必要なのは、180度回転しても有効な数字として成立するのは 0、1、6、8、9 の5種類だけという点です。2、3、4、5、7 を含む数値は、回転しても正しい数として扱うことができません。
今回求められているのは、自然数 num を第1引数(唯一の引数)として受け取るJavaScript関数を作成することです。この関数はまず、num 以下のすべての自然数(num 自身を含む)からなる配列を構築します。
たとえば num = 5 の場合、生成される配列は次のようになります。
[1, 2, 3, 4, 5]
続いて、この配列の中に紛らわしい数がいくつ含まれているかを数え、最終的にその個数を返します。
具体例
入力が次の場合を考えてみましょう。
const num = 10;
このときの出力は次の通りです。
const output = 5;
その理由はこうです。まず配列は [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] となり、この中で紛らわしい数に該当するのは次の5つだからです。
1, 6, 8, 9, 10
- 1 … 回転しても 1 のまま
- 6 … 回転すると 9 になる
- 8 … 回転しても 8 のまま
- 9 … 回転すると 6 になる
- 10 … 回転すると 01(= 1)になる
サンプルコード
実際の実装コードは以下の通りです。
const num = 10;
const countConfusing = (num = 1) => {
let count = 0;
const valid = '01689';
const rotateMap = {'0': '0', '1': '1', '6': '9', '8': '8', '9': '6'};
const prepareRotation = num => {
let res = '';
const numArr = String(num).split('');
if(numArr.some(el => !valid.includes(el))){
return false;
};
numArr.map(el => {
res = rotateMap[el] + res;
});
return +res;
};
for(let i = 1; i <= num; i++){
const rotated = prepareRotation(i);
if(rotated && rotated > 0 && rotated <= num){
count++;
};
};
return count;
};
console.log(countConfusing(num));
処理のポイント
このコードの仕組みを整理すると、次の3ステップになります。
- 無効な数字の除外:回転が有効な「01689」以外の数字を含む数値は false を返し、カウント対象から除外します。
- 桁の反転と置き換え:rotateMap を使って各桁を回転後の数字に変換します。重要なのは、180度回転では桁の並び自体も反転するため、結果を逆順に組み立てる点です(例:16 → 91)。
- 範囲内の判定とカウント:1から num までの各数値について回転結果を計算し、有効な数かつ num 以内であればカウントを増やします。
実行結果
上記のコードを実行すると、コンソールには次のように出力されます。
5
-
JavaScriptで数値が三角数かどうかを判定する方法
三角数(Triangular Number)とは? 三角数とは、点を正三角形の形に敷き詰めたときに現れる数のことです。n番目の三角数は「1からnまでの自然数の合計」として表され、次の公式で求められます。 Tn = n(n+1) / 2 具体的な三角数は 1, 3, 6, 10, 15, 21, 28 … と続きます。例えば 10 は、各辺に4個の点を配置した正三角形を構成できるため、三角数です。 問題 数値を引数として受け取り、その数値が三角数であれば true を、そうでなければ false を返すJavaScript関数を実装します。 判定の考え方 n(n+1)/2 = num となる正
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実