华为OD机试真题 JavaScript 实现【水仙花数】【2022Q4 100分】

在这里插入图片描述

一、题目描述

所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。

例如153是水仙花数,153是一个3位数,并且153 = 1^3 + 5^3 + 3^3。

二、输入描述

第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。

第二行输入一个正整数m,表示需要返回第m个水仙花数。形如HH:SS字符串,表示原始输入。

三、输出描述

返回长度是n的第m个水仙花数。个数从0开始编号。

若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。

若输入不合法,返回-1。

四、解题思路

  1. 读取输入的n和m;
  2. 检查n的范围是否在3到7之间,如果不在范围内,输出-1并结束程序;
  3. 根据n的值计算出范围内的最小值和最大值,最小值为10的(n-1)次方,最大值为10的n次方减1;
  4. 初始化一个HashMap用于存储水仙花数,键为水仙花数的序号,值为水仙花数本身;
  5. 初始化计数器count为0,用于记录水仙花数的个数;
  6. 初始化变量lastNum为0,用于记录最后一个水仙花数;
  7. 遍历从最小值到最大值的范围,对每个数进行如下操作:
    • 调用check方法检查该数是否为水仙花数,如果是,则将其添加到HashMap中,键为count,值为当前数,然后将count加1。
    • 如果当前数大于lastNum,则更新lastNum的值为当前数。
  8. 根据HashMap判断第m个水仙花数是否存在,如果存在,则输出对应的值;如果不存在,则输出lastNum乘以m的值;

五、JavaScript算法源码

function calculate() {
    const readline = require('readline');
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    rl.question('请输入一个n位的正整数(n在3到7之间):', n => {
        if (n >= 3 && n <= 7) {
            rl.question('请输入需要返回第m个水仙花数(m为非负整数):', m => {
                m = parseInt(m);
                if (!isNaN(m) && m >= 0) {
                    const min = Math.pow(10, n - 1);
                    const max = Math.pow(10, n) - 1;
                    const data = {};
                    let count = 0;
                    let lastNum = 0;

                    for (let i = min; i <= max; i++) {
                        if (check(i, n)) {
                            data[count++] = i;
                            if (i > lastNum) {
                                lastNum = i;
                            }
                        }
                    }

                    if (data.hasOwnProperty(m)) {
                        console.log(`${m}个水仙花数为:${data[m]}`);
                    } else {
                        console.log(`${m}个水仙花数不存在,返回最后一个水仙花数${lastNum}乘以${m}的值:${lastNum * m}`);
                    }
                } else {
                    console.log('输入不合法,请输入一个非负整数作为m!');
                }

                rl.close();
            });
        } else {
            console.log('输入不合法,请输入一个在3到7之间的整数作为n!');
            rl.close();
        }
    });
}

function check(a, n) {
    const numStrs = String(a).split('');
    const data = numStrs.map(Number);
    let sum = 0;

    for (let i = 0; i < n; i++) {
        sum += Math.pow(data[i], n);
    }

    return sum === a;
}

calculate();

六、效果展示

在这里插入图片描述


下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(javascript,开发语言,ecmascript,算法,学习)