华为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.mzph.cn/news/720960.shtml

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

相关文章

前端:js实现页面跳转

一、使用 window.location 对象来实现页面跳转 // 在当前页面打开新的 URL window.location.href https://www.example.com;// 或者使用下面的方法 window.location.assign(https://www.example.com); 二、在当前页面的历史记录中创建一个新的条目&#xff08;允许用户通过浏…

外部存储器接口(EMIF)

外部存储器接口&#xff08;EMIF&#xff09; 该设备支持双核架构&#xff1b;为了为每个CPU子系统提供一个专用的EMIF&#xff0c;该设备支持两个EMIF模块——EMIF1和EMIF2。两个模块完全相同&#xff0c;具有相同的功能集&#xff0c;但具有不同的地址/数据大小。EMIF1在CPU…

Unity 角色控制(初版)

角色控制器组件&#xff0c;当然是将组件放在角色上了。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c1 : MonoBehaviour {// 获取角色控制器private CharacterController player;void Start(){// 加载角色控制器player …

Qt应用软件【测试篇】Dr.Memory动态测试内存

文章目录 Dr.Memeory 简介特点下载地址windows安装及使用Dr. Memory在Linux或Mac OSX在Windows上安装Dr. MemoryDr. Memory和MinGWDr. Memory和Visual Studio使用Visual Studio编译没有Visual Studio集成开发环境(IDE)命令测试结果更多内容

机器学习 | 模型性能评估

目录 一. 回归模型的性能评估1. 平均平方误差(MSE)2. 平均绝对误差(MAE)3. R 2 R^{2} R2 值3.1 R 2 R^{2} R2优点 二. 分类模型的性能评估1. 准确率&#xff08;Accuracy&#xff09;2. 召回率&#xff08;Recall&#xff09;3. 精确率&#xff08;Precision&#xff09;4. …

大模型学习笔记五:RAG

文章目录 一、RAG介绍1)局限性2)通过检索增强生成二、RAG系统的基本搭建流程1)搭建流程简介2)文档的加载和切割3)检索引擎4)LLM接口封装5)prompt模板6)RAG Pipeline初探7)关键字检索局限性三、向量检索1)文本向量2)向量相似度计算3)向量数据库4)基于向量检索的RAG…

电源完整性设计的重要三步!

电源模块布局布线 电源模块是电子设备的能量来源&#xff0c;其性能与布局直接影响到整个系统的稳定性和效率。正确的布局和走线不仅能减少噪声干扰&#xff0c;还能确保电流的顺畅流通&#xff0c;从而提高整体性能。 1、电源模块布局 ● 源头处理&#xff1a;电源模块作为…

Java 面试题

Java 基础 以下代码执行结果&#xff1f; 示例1&#xff1a; public static void main(String[] args) {int a 0;Integer b 0;String c "0";String d new String("0");change(a, b, c, d);System.out.println(a "|" b "|" …

网络支付个人信息安全的挑战与保护策略

随着互联网的飞速发展和大数据时代的来临&#xff0c;网络支付已逐渐成为人们日常生活中不可或缺的一部分。从线上购物到线下扫码&#xff0c;从水电煤缴费到交通出行&#xff0c;网络支付已经渗透到生活的方方面面。然而&#xff0c;在享受便捷的同时&#xff0c;网络支付个人…

glibc

交叉编译器的glibc库位置&#xff1a; 用此交叉编译器编译的根文件系统对应的开发板上的GLIBC版本&#xff1a; 证明buildroot会使用交叉编译器自带的glibc库来对根文件系统进行编译。

网安笔记(一)

一、渗透测试的流程 1.明确目标&#xff1a; 确定需要渗透资产的范围&#xff1b;确定规则&#xff0c;怎么去渗透&#xff1b;确定需求&#xff1a;需要达到什么样的效果 2.信息收集&#xff1a; 首先可以用社会工程学的方法来收集信息&#xff0c;看看有没有好的薄弱点。然…

如何在CentOS部署JumpServer堡垒机并实现无公网ip环境远程访问

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

通义千问1.5(Qwen1.5)大语言模型在PAI-QuickStart的微调与部署实践

作者&#xff1a;汪诚愚&#xff08;熊兮&#xff09;、高一鸿&#xff08;子洪&#xff09;、黄俊&#xff08;临在&#xff09; Qwen1.5&#xff08;通义千问1.5&#xff09;是阿里云最近推出的开源大型语言模型系列。作为“通义千问”1.0系列的进阶版&#xff0c;该模型推出…

【鸿蒙 HarmonyOS 4.0】登录流程

一、背景 登录功能在应用中是一个常用模块&#xff0c;此次使用 HarmonyOS 实现登录流程&#xff0c;包含页面呈现与网络请求。 二、页面呈现 三、实现流程 3.1、创建项目 构建一个ArkTS应用项目(Stage模型)&#xff0c;今天创建流程可查看官网教程&#xff1a;文档中心 目…

Codeforces Round 877 (Div. 2)---->B. Minimize Permutation Subarrays

一&#xff0c;思路&#xff1a; 任何一个子数组如果要构成排列&#xff0c;那么一定需要数字 1在其中&#xff0c;要不然无论如何都不能构成一个排列&#xff0c;那么我们抓住这一点&#xff0c;只要我们把最大值放到 数字1 和 数字2之间&#xff0c;那么一定可以使结果最小。…

linux kernel物理内存概述(三)

目录 物理内存空间划分 物理内存初始化 查看当前页面分配状态 页块 页面如何添加到伙伴系统中&#xff1f; 物理内存空间划分 32位系统 4GB 用户空间和内核空间划分 3&#xff1a;1 ARM64架构处理器虚拟地址空间划分方式&#xff1b; 内核中使用PAGE_OFFSET宏计算 内核线…

llc半桥开关电源基础知识2(电路图简化)

llc半桥开关电源拓扑图如下 稳态:LLC电源已经正常工作,已经输出电压稳定稳态:LLC电源已经正常工作,已经输出电压稳定。 我们在分析拓扑结构的时候,都是基于他已经正常稳定输出的时候来分析的,毕竟LC电源只要以工作啊,绝大多数时间都是工作在稳态。 具体电路图化简分析如…

Android activity的启动模式和生命周期

一、Activity的启动模式有四种&#xff1a;standard&#xff08;默认&#xff09;、singleTop&#xff08;栈顶复用&#xff09;、singleTask&#xff08;栈内复用&#xff09;、singleInstance&#xff08;单例模式&#xff09; 使用方法&#xff1a; 在清单文件中声明 Acti…

yolov9训练

目录 说明 1、下载代码安装新的python环境 2、准备数据 3、修改代码 说明 本文参考该博主的文章&#xff0c;在已经有数据的情况&#xff0c;进行简单总结。需要详细版见原文链接如下&#xff1a;YOLOV9保姆级教程-CSDN博客 1、下载代码安装新的python环境 代码下载&…

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…