华为OD机试 - 数字排列 - 深度优先搜索dfs算法(Java 2024 C卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
      • 1、输入
      • 2、输出
      • 3、说明
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

小明负责公司年会,想出一个趣味游戏:

屏幕给出1~9任意4个不重复的数字,大家以最快的时间给出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出数字中最大的数(如果不到这么多数字,则给出最后一个即可)。

注意:

  • 2可以当做5来使用,5也可以当做2来使用进行数字拼接,且屏幕不能同时给出2和5;
  • 6可以当做9来使用,9也可以当做6来使用进行数字拼接,且屏幕不能同时给出6和9;

如给出:1,4,8,7,则可以拼接的数字为:

1,4,7,8,14,17,18,41,47,48,71,74,78,81,84,87,147,148,178,187…

那么第N个数字,即第8个数字为41,输出41。

二、输入描述

输入以逗号分隔的4个1~9的数字组成的字符串。

三、输出描述

输出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出数字中最大的数。

如果输入的数字不在规定的范围内或有重复,则输出-1

1、输入

1,4,8,7

2、输出

41

3、说明

可以拼接的数字为:

1,4,7,8,14,17,18,41,47,48,71,74,78,81,84,87,147,148,178,187…

那么第N个数字,即第8个数字为41,输出41。

四、解题思路

  1. 输入4个1~9的数字,升序排序;
  2. 校验输入合法性;
    • 如果不足4个数字,则输出-1;
    • 输入必须是1~9的数字;
    • 不能同时包含2和5;
    • 不能同时包含6和9;
  3. 取最大的数N;
  4. 通过深度优先搜索dfs算法,拼接所有数字,参数依次为(输入的4位数数组、数字是否使用过、拼接的数字)
  5. 获取组成的数字从小到大排序后第N个数字。

五、Java算法源码

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Test03 {static int N = 0;static StringBuilder builder = new StringBuilder();static int ret = -1;static Map<Integer,Integer> map = new HashMap<>();static {map.put(2,5);map.put(5,2);map.put(6,9);map.put(9,6);}/*** 2和5可以互换,且不能同时出现* 6和9可以互换,且不能同时出现*/public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 5,7,1,6int[] arr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();Arrays.sort(arr);// 升序排序 1 5 6 7// 校验输入合法性if (!checkNum(arr)) {System.out.println(-1);return;}N = arr[3];// 取最大的数boolean[] usedArr = new boolean[4];dfs(arr, usedArr, "");// 获取组成的数字从小到大排序后第N个数字System.out.println(getNumInN(builder));}static String start = "";/*** @param arr     输入的4位数数组 1 5 6 7* @param usedArr 数字是否使用过* @param tempNum 拼接的数字*/private static void dfs(int[] arr, boolean[] usedArr, String tempNum) {builder.append(tempNum).append(",");for (int i = 0; i < arr.length; i++) {// 如果当前数用过了,则跳过if (usedArr[i]) {continue;}usedArr[i] = true;dfs(arr, usedArr, tempNum + arr[i]);if(map.containsKey(arr[i])){dfs(arr, usedArr, tempNum + map.get(arr[i]));}usedArr[i] = false;}}private static boolean checkNum(int[] arr) {// 如果不足4个数字,则输出-1if (arr.length != 4) {return false;}int sum2 = 0;int sum6 = 0;for (int i = 0; i < arr.length; i++) {int n = arr[i];// 输入必须是1~9的数字if (n < 1 || n > 9) {return false;}// 不能同时包含2和5if (n == 2 || n == 5) {sum2++;}// 不能同时包含6和9if (n == 6 || n == 9) {sum6++;}}if (sum2 > 1 || sum6 > 1) {return false;}return true;}// 获取组成的数字从小到大排序后第N个数字private static int getNumInN(StringBuilder builder) {builder.deleteCharAt(0);builder.deleteCharAt(builder.length() - 1);int[] arr = Arrays.stream(builder.toString().split(",")).mapToInt(Integer::parseInt).toArray();Arrays.sort(arr);//升序排序return arr[N - 1];}
}

六、效果展示

1、输入

1,4,8,7

2、输出

41

3、说明

获取组成的数字从小到大排序后第8个数字:

1,4,7,8,14,17,18,41,47,48,71,74,78,81,84,87,147,148,174,178,184,187…

即为41。

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511385.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode每日一题之 复写0

目录 题目介绍&#xff1a; 算法原理&#xff1a; 特殊位置处理&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 这种对数组元素进行修改&#xff0c;移动的题目我们仍然可以…

Unity之街机捕鱼

目录 &#x1f62a;炮台系统 &#x1f3b6;炮口方向跟随鼠标 &#x1f3b6;切换炮台 &#x1f62a;战斗系统 &#x1f3ae;概述 &#x1f3ae;单例模式 &#x1f3ae;开炮 &#x1f3ae;子弹脚本 &#x1f3ae;渔网脚本 &#x1f3ae;鱼属性信息的脚本 &#x1f6…

【探索AI】二十一 深度学习之第4周:循环神经网络(RNN)与长短时记忆(LSTM)

循环神经网络&#xff08;RNN&#xff09;与长短时记忆&#xff08;LSTM&#xff09; RNN的基本原理与结构LSTM的原理与实现序列建模与文本生成任务实践&#xff1a;使用RNN或LSTM进行文本分类或生成任务步骤 1: 数据准备步骤 2: 构建模型步骤 3: 定义损失函数和优化器步骤 4: …

【系统架构设计师考试大纲】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱考试目标考试要求考试题目题型分析计算机基础知识&#xff08;20%&#xff09;信息化战略与规划&#xff08;9%&#xff09;软件工程&#xff08;25%&#xff09;系统架构设计&#xff08;35%&#xff09;信…

视觉基本数据和基线代码获取

机器视觉相关网站推荐 - 知乎 1. 搜benchmark, 视觉相关的&#xff0c;任何一个行业&#xff0c;只要是一个大众的&#xff0c;都有自己的benchmark. 一般都会有自己的数据集和相应的代码。很多benchmark都会帮我们搜集优秀的代码和数据集。 http://shuoyang1213.me/WIDERFA…

Linux 驱动 中断(一)

中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行。 在 Linux 中&#xff0c;中断处理是操作系统与硬件设备之间通信的重要方式之一。Li…

FT4222模块树莓派使用

关于FT4222设备 FT4222是一款功能强大的USB到SPI/I2C/GPIO的转接器桥&#xff0c;由芯片制造商FTDI&#xff08;Future Technology Devices International Ltd.&#xff09;开发和生产。该模块可以将USB接口转换为SPI&#xff0c;I2C接口或GPIO接口&#xff0c;从而方便地连接…

Fantasy UI

有了这个包&#xff0c;你可以获得一个完整的幻想rpg游戏ui的psd源文件。 下载&#xff1a;​​Unity资源商店链接资源下载链接 效果图&#xff1a;

阿里云创建的SpringBoot项目打包时找不到主清单属性

原因是因为maven配置文件中有一个打包属性配置 <configuration><mainClass>com.yang.ExamSystemApplication</mainClass><!-- 找到这个<skip>true</skip>标签关闭&#xff0c;或者属性改为false --><skip>true</skip> </c…

40个Python字符串实例

Python 字符串是 Python 编程语言中最常用的数据类型之一&#xff0c;它可以表示文本或一组字符。Python 中的字符串是不可变的序列&#xff0c;意味着一旦创建&#xff0c;其值就不能被修改。下面是一些关于 Python 字符串的介绍。 概述 创建字符串&#xff1a;可以使用单引…

通过zabbix监控docker宿主机

通过Zabbix监控Docker主机及其容器&#xff0c;您可以利用Zabbix Agent2的内置功能来收集和报告Docker容器的相关指标。以下是基本步骤概要&#xff1a; 安装与配置Zabbix Agent2&#xff1a; 在Docker主机上安装Zabbix Agent2。确保Agent2能够访问Docker守护进程&#xff0c;并…

Tomcat常见配置(基础功能、虚拟主机、搭建博客)

目录 一、Tomcat基础功能 1、自动解压war包 2、Tomcat工具界面 2.1 Server Status (服务器状态) 2.1.1 本地登录状态页 2.1.2 远程登录状态页 2.2 Manager App (管理应用程序) 2.3 Host Manager (主机管理器) 3、Context 配置 二、配置虚拟主机 三、搭建 JPress 博客…