华为OD机试真题B卷 Java 实现【水仙花数】,附详细解题思路

news/2025/2/12 0:11:43/

一、题目描述

所谓水仙花数,是指一个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的值;

五、Java算法源码

public static void main(String[] args) {calculate();
}private static void calculate() {Scanner sc = new Scanner(System.in);int n = sc.nextInt();if (n >= 3 && n <= 7) {int m = sc.nextInt();int temp = 1;for (int i = 0; i < n; i++) {temp *= 10;}int min = temp / 10;int max = temp - 1;Map<Integer, Integer> data = new HashMap<>();int count = 0;int lastNum = 0;for (int i = min; i <= max; i++) {if (check(i, n)) {data.put(count++, i);if (i > lastNum) {lastNum = i;}}}if (data.containsKey(m)) {System.out.println(data.get(m));} else {System.out.println(lastNum * m);}} else {System.out.println(-1);}
}private static boolean check(int a, int n) {boolean flag = false;String[] numStrs = String.valueOf(a).split("");int[] data = new int[numStrs.length];for (int i = 0; i < numStrs.length; i++) {data[i] = Integer.parseUnsignedInt(numStrs[i]);}int sum = 0;for (int i = 0; i < n; i++) {sum += calcute(data[i], n);}if (sum == a) {flag = true;}return flag;
}private static int calcute(int a, int b) {int result = 1;for (int i = 0; i < b; i++) {result *= a;}return result;
}

六、效果展示

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。


http://www.ppmy.cn/news/173083.html

相关文章

龙迅LT6911

1. 描述 LT6911C 是一款面向 VR/智能手机 / 显示应用的高性能 HDMI1.4 至 MIPIDSI/CSI/LVDS 芯片。 对于 MIPIDSI/CSI 输出&#xff0c;LT6911C 具有可配置的单端口或双端口 MIPIDSI/CSI&#xff0c;具有 1 个高速时钟通道和 1~4 个高速数据通道&#xff0c;工作速率为最大 1.5…

龙迅LT9611

1. 描述 LT9611 MIPI DSI/CSI 至 HDMI1.4 桥接器具有双端口 MIPI D-PHY 接收器前端配置&#xff0c;每个端口有 4 个数据通道&#xff0c;每个数据通道以 2Gbps 的速度工作&#xff0c;最大输入带宽为 16Gbps。 该桥接器提供一个 HDMI 数据输出&#xff0c;具有可选的 SPDIF 或…

R8.com

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/5/25 19:32 五月 # Author : ikaoser # Email : 5584805qq.com # File : r18com.py # Project : PYthonProjactimport os, requests, time, random from queue import Queue from concurrent.futures import Thre…

RT-Thread串口设备实操

RT-Thread 文档中心 【1】常用函数&#xff1a; rt_device_find()查找设备rt_device_open()打开设备rt_device_read()读取数据rt_device_write()写入数据rt_device_control()控制设备rt_device_set_rx_indicate()设置接收回调函数rt_device_set_tx_complete()设置发送完成回调…

RTL-SDR

RTL-SDR是一个非常低的成本&#xff08;某宝几十块可以轻松拿下&#xff09;&#xff0c;易于使用的USB设备&#xff0c;接收射频无线电信号。 最初&#xff0c;这些设备被设计为用作DVB-T&#xff08;数字视频广播地面&#xff09;接收器&#xff0c;但人们发现&#xff0c;只…

RTL8211移植

RTL8211是嵌入式中常用的一种PHY芯片。对于网口驱动的移植&#xff0c;只要u-boot和kernel有支持的驱动&#xff0c;移植方法还是比较简单的。 u-boot中的RTL8211移植 对于PHY的移植&#xff0c;大多数情况下只需要修改config文件即可&#xff0c;但是也有例外&#xff0c;这时…

RT-Thread ——RTC配置

RT-Thread ——RTC配置 STM32F103系列芯片的RTC功能存在一些缺陷。 一、显示时间戳 RTC&#xff08;Real-Time Clock&#xff09;译为实时时钟&#xff0c;因为它一般是集成电路&#xff0c;故也称为时钟芯片。它能提供精确的实时时间&#xff0c;可以用于产生年、月、日、时…

RT-Thread系统简介

前言 RT-Thread是一款国产的实时操作系统&#xff0c;我们首先从实时操作系统开始进行介绍&#xff0c;再展开RT-Thread操作系统。 实时操作系统介绍 实时操作系统诞生背景 为了解决两个问题&#xff1a; 一个是早期的CPU任务切换的开销太大&#xff0c;实时调度器可以避免…