华为OD机试真题【组合出合法最小数】

news/2024/11/22 18:17:20/

1、题目描述

【组合出合法最小数】
给一个数组,数组里面都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字。

【输入描述】
一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头,例如:[“13”, “045”, “09”, “56”]。
数组的大小范围:[1, 50] ;数组中每个元素的长度范围:[1, 30]

【输出描述】
以字符串的格式输出一个数字,如果最终结果是多位数字,要优先选择输出不是“0”开头的最小数字;如果拼接出的数字都是“0”开头,则选取值最小的,并且把开头部分的“0”都去掉再输出;如果是单位数“0”,可以直接输出“0”

【示例1】
输入:
20 1
输出:
120
说明:[“20”, “1”]能组成 201和120, 其中120比较小

【示例2】
输入:

08 10 2
输出:
10082
说明:[“08”, “10”, “2”]能组成 08102、 08210、10082、10208、20810、21008等数字,其中"0"开头的08102和08201排除,选择最小的10082输出

【示例3】
输入:
01 02
输出:
102
说明:[“01”, “02”]能拼接成0102和0201,都是“0”开头,选取较小的0102,去掉前面的0,输出102

2、解题思路

该题运用了两种解题方式,一种是先排序后组合,及将数组从小到大排序,依次遍历拼接,如果存首位不为0的数值,将第一个首位不为0的数值放在最前面,该组合得到的数值即为不是0开头中最小的,或全为0开头中最小的;
第二种解题方式是先组合后排序,运用回溯算法遍历得到所有的组合,再将组合的数值排序,排序后的数值中最后一个数是以0开头的,则排序组合这第一个即为最小的结果,否则往前遍历到第一个首位不为0的数值即为最小的结果

3、参考代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;/*** @Author* @Date 2023/5/4 23:53*/
public class 组合出合法最小数 {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {String[] arrays = in.nextLine().split(" ");System.out.println(method1(arrays));  // 方法一System.out.println(minNum(arrays));  // 方法二}}// 方法一:排序public static String minNum(String[] arrays) {Arrays.sort(arrays, (o1, o2) -> (o1 + o2).compareTo(o2 + o1));boolean appendFirst = true;  // 遍历定为首个起始位不为 0 的数字StringBuilder sb = new StringBuilder();for (String arr : arrays) {if (arr.startsWith("0")) {sb.append(arr);continue;}if (appendFirst) {  // 如果存首位不为0的数值,将第一个首位不为0的数值放在最前面sb.insert(0, arr);appendFirst = false;continue;}sb.append(arr);}if (appendFirst) {return delZero(sb.toString());}return sb.toString();}// 方法二:回溯遍历组合static List<String> path = new ArrayList<>();static List<String> result = new ArrayList<>();static boolean[] used;public static String method1(String[] arrays) {path.clear();result.clear();used = new boolean[arrays.length];Arrays.fill(used, false);dfs(arrays, 0);Collections.sort(result);String target = null;int right = result.size() - 1;while (right >= 0) {if (right == (result.size() - 1 ) && result.get(right).startsWith("0")) {target = delZero(result.get(0));break;}if (result.get(right).startsWith("0")) {break;}target = result.get(right);right--;}return target;}public static void dfs(String[] arrays, int count) {if (count == arrays.length) {String res = getPathString(path);result.add(res);return;}for (int i = 0; i < arrays.length; i++) {if (used[i]) {continue;}path.add(arrays[i]);used[i] = true;dfs(arrays, count + 1);used[i] = false;path.remove(path.size() - 1);}}public static String getPathString(List<String> path) {StringBuilder sb = new StringBuilder();for (String str : path) {sb.append(str);}return sb.toString();}// 删除字符串前面的0public static String delZero(String target) {int pos = 0;for (int i = 0; i < target.length() - 1; i++) {if (target.charAt(i) != '0') {break;} else {pos++;}}return target.substring(pos);}}

4、相似题目

(1)代码随想录
(2)字母组合


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

相关文章

opencv进阶02-在图像上绘制多种几何图形

OpenCV 提供了方便的绘图功能&#xff0c;使用其中的绘图函数可以绘制直线、矩形、圆、椭圆等多种几何图形&#xff0c;还能在图像中的指定位置添加文字说明。 OpenCV 提供了绘制直线的函数 cv2.line()、绘制矩形的函数 cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的…

Java异步方法CompletableFuture类的使用

Java中常用的异步方法 1、使用线程&#xff1a;你可以创建一个新的线程来执行异步操作。这可以通过直接创建Thread对象并启动它&#xff0c;或者使用线程池来管理线程的生命周期。 new Thread(() -> {// 异步操作代码 }).start(); 2、使用线程池Executor框架&#xff1a;E…

【C语言实战项目】通讯录

一.了解项目功能 在本次实战项目中我们的目标是实现一个通讯录: 该通讯录可以用来存储1000个人的信息 每个人的信息包括&#xff1a;姓名、年龄、性别、住址、电话 通讯录提供功能有&#xff1a; 添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有…

SSM——用户、角色、权限操作

1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…

华创云鼎面试:java后端开发

华创云鼎面试: 1、项目:项目业务介绍、项目人员组成 2、分布式锁用过哪些 基于数据库的锁&#xff1a;可以使用关系型数据库的事务和行级锁来实现分布式锁。通过在数据库中创建一个标志位或特定的锁表来表示资源的锁定状态&#xff0c;其他进程在访问该资源之前需要先获取该锁…

css浮动(为什么要清除浮动?清除浮动有哪几种方式?)

为什么要清除浮动&#xff1f; 清除浮动主要是为了清除浮动元素造成的影响&#xff0c;使浮动元素不会影响其后元素的布局 防止父元素高度塌陷&#xff1a;当元素浮动后&#xff0c;它会脱离一个标准文档流&#xff0c;不再占用原先的布局空间。如果一个父元素内只有浮动元素&a…

Linux 设置 ssh 内网穿透

背景&#xff1a;有三台机器A、B、C&#xff0c;机器 A 位于某局域网内&#xff0c;能够连接到互联网。机器 B 有公网 IP&#xff0c;能被 A 访问到。机器 C 位于另外一个局域网内&#xff0c;能够连接到互联网&#xff0c;能够访问 B。 目标&#xff1a;以 B 为中介&#xff…

ASP.NET WEB API通过SugarSql连接MySQL数据库

注意&#xff1a;VS2022企业版可以&#xff0c;社区版可能存在问题。实体名称和字段和数据库中的要一致。 1、创建项目&#xff0c;安装SqlSugarCore、Pomelo.EntityFrameworkCore.MySql插件 2、文件结构 2、appsettings.json { “Logging”: { “LogLevel”: { “Default”: …