数组组成的最小数字 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出(如果数组长度小于3,则选择数组中所有元素来组成最小数字)。

输入描述

一行用半角逗号分割的字符串记录的整型数组,0<数组长度<=100,0<整数的取值范围<=10000。

输出描述

由3个元素组成的最小数字,如果数组长度小于3,则选择数组中所有元素来组成最小数字。

示例1

输入:
21,30,62,5,31

输出:
21305

说明:
数组长度超过3,需要选3个元素组成最小数字,21305由21,30,5三个元素组成的数字,为所有组合中最小的数字

示例2

输入:
5,21

输出:
215

说明:
数组长度小于3,选择所有元素来主城最小值,215为最小值。

题解

题目类型

该题属于贪心算法的应用,因为我们需要在给定的条件下,组合数字,使得最终结果最小。通过排列组合元素并比较组合后的结果大小,我们可以找到符合要求的最小数。

解题思路

题目要求从数组中选择3个元素,组成最小的数字,并且如果数组长度小于3,则直接将所有元素组成最小的数字。解题的核心在于如何组合这3个数字使得结果最小。可以通过全排列来生成所有可能的组合,然后找到最小的一个。具体解题步骤如下:

  1. 数组长度判断
    • 如果数组长度为1,直接输出该元素。
    • 如果数组长度为2,计算两种不同的组合,取最小值。
    • 如果数组长度大于等于3,进行全排列组合,找到由3个元素组成的最小数字。
  2. 排列组合:当数组长度大于等于3时,可以通过遍历所有3个元素的排列,依次生成这些排列所形成的数,并记录最小的数值。
  3. 贪心策略:为了使得最终的数最小,我们需要比较不同的排列所形成的数字,选择其中最小的一个。这就是典型的贪心算法思想:每一步都选择局部最优的排列。

代码大致描述

无论是哪种语言实现,整体思路大致相同:

  1. 输入解析:将输入的字符串按逗号分割成一个数组。
  2. 特殊情况处理:如果数组长度小于3,直接返回组合后的最小值。
  3. 全排列查找最小值:遍历数组,选择三个不同的元素,生成所有可能的数字组合,最后返回最小的数字。
  4. 输出结果:打印最小的组合数。

时间复杂度

  • 时间复杂度
    • 如果数组长度为n,当n≥3时,生成三个元素的所有组合所需时间复杂度为O(n^3)。
    • 数组中每次组合后的字符串拼接操作为常数时间,比较字符串形成的整数也为常数时间。
  • 空间复杂度:由于只使用了几个变量来存储最小值和临时组合,空间复杂度为O(1),输入数组的存储空间不计算在内。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) throws Exception {
        Scanner in = new Scanner(System.in);
        String[] arr = in.nextLine().split(",");
        int n = arr.length; // 获取输入的长度

        // 只有一个元素时,直接输出
        if (n == 1) {
            System.out.println(arr[0]);
            return;
        }

        // 如果有两个元素,则比较两种组合,输出最小值
        if (n == 2) {
            String s1 = arr[0], s2 = arr[1];
            System.out.println(Math.min(Long.parseLong(s1 + s2), Long.parseLong(s2 + s1)));
            return;
        }


        

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试题库题解2024 文章被收录于专栏

华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。

全部评论
参考这道题https://www.nowcoder.com/discuss/666651717169074176?sourceSSR=users,但是需要增加一个判断,因为是取前三位拼接所以还需要考虑拼接后的字符长度最短,而且字符长度最小优先级最高,那么优先统计最小的前三长度,然后根据a+b>b+a排序后的数组筛选符合长度条件的前三个数拼接。时间复杂度O(n log n)
1 回复 分享
发布于 10-25 00:51 上海

相关推荐

10-25 18:22
已编辑
天津工业大学 Java
9.18:在boss海投点到德科(华为od)的java开发岗,本着来都来了的原则,点了沟通,hr向我获取身份证号开启流程,是否拿到了双证,要了双证照片,给我发了机考注意事项,非目标院校最好300+9.25:聊天,问我大概计划什么时候考,我回复9.279.26:做了几道原题感觉速度太慢了,推到国庆10.4:笔试:我考的E卷,在网上看到都说是原题,我考的3道题也是原题。1.最大花费金额&nbsp;2.&nbsp;选修课&nbsp;3.Wonderland10.11:hr电话,对个人情况做扩充:今年刚毕业?A:对;毕业之后到现在这段时间在做什么?46级过了吗?A:没过;&nbsp;考虑华为这边的工作岗位是什么原因?老家哪里的?现在在哪?意向工作地点?为什么考虑去东莞发展?打算长期在东莞发展吗?加班情况之前有了解吗?你机考前有刷过题库吗?A:有刷过;你考试中有遇到相似的题目吗?A:没有,题库还是很大的;你的机考有一个需要澄清的点,就是编程题1相似度比较高,显示有作弊嫌疑所以你要澄清下,是这个题是常规题吗?A:是常规题,双指针确实比较常见。10.12:综面:除了问秋招和春招情况,大概问的和hr打的电话问的差不多。过了后跟hr提交了一些资料,hr帮忙联系部门,帮了我联系了不需要4级的部门,所以我不用进行英语测试了。10.16:技术一面:紧张,答得磕磕巴巴,面了1小时二十几分钟,面试官还是很耐心的,。1.&nbsp;讲一下简历以外的技术经历或经验2.&nbsp;我看你是应届的嘛,毕业后有实际的项目经验吗?&nbsp;&nbsp;没有3.&nbsp;你之前的比赛是怎样分工,或者说开发流程是怎样的?4.&nbsp;其实你可以简单的概括下,你们大学里有学过软件工程之类的课吧?有学过。5.&nbsp;你其实说的实际过程,其实就是软件工程里的一个基本流程对吧?对&nbsp;(其实软件工程忘光了)6.&nbsp;你有关注到使用的jdk版本吗?有,第一次使用java8,之后都用的11,17.7.&nbsp;你能简单说一下这几个版本之间的差距吗?其实我分不清区别8.&nbsp;那你为什么要用最新的版本呢?尝试跟下版本。9.&nbsp;java8有用到stream流吗?有,经常用,sort,过滤,聚合什么的。10.&nbsp;java8里有一些并行的使用方式有用到吗?多线程,thread对吧?11.&nbsp;thread一直都有的,有一个mapreduce类似于带框架?不了解,只知道有个线程池12.&nbsp;线程池有用过吗?学习中有用到,项目中没有13.&nbsp;我看到你的简历里面,在学习有用到redis对吧?对14.&nbsp;在你的秒杀系统项目中,redis用来做什么?做缓存,减小数据库的压力15.&nbsp;数据库的压力有多大,redis为什么能减小数据库的压力?(数据库压力答的跑题,redis减小数据库的访问)16.&nbsp;jmeter有用过吗?有,一次。17.&nbsp;jmeter在使用时可以设置哪些参数?线程组设置多少个线程,http请求参数,18.&nbsp;你那个两千个qts是怎么得出来的?估计值,设置多少个线程执行多少次。19.&nbsp;你能解释一下乐观锁是什么意思?行锁,巴拉巴拉20.&nbsp;乐观锁的定义是什么?(上个问题答错了)不太了解,胡说了一点之后,沉默了一段时间。21.&nbsp;你可以去关注一下原理,不要只是关注怎么用的,我其实想问为什么你可以通过乐观锁可以解决超卖?用消息队列将并行请求转串行,交给订单处理模块,再进行数据库写入,这样数据库压力小了许多22.&nbsp;令牌桶算法清楚吗?巴拉巴拉23.&nbsp;用令牌桶算法做限流会有什么问题?只回答了可能产生请求波峰。24.&nbsp;你项目中令牌桶是自己实现还是外部模块?外部模块,名字忘了。25.&nbsp;redis预处理和rabbitmq使用时有什么注意事项?我回答了redis需要预热,rabbitmq没有太多经验26.&nbsp;你用的时候有没有碰到什么问题?redis把内存有没有占满之类的?遇到的问题最大的是:启动了几个java微服务cpu干到100%27.&nbsp;用redis会去看使用资源情况吗?我就会个top命令。28.&nbsp;使用redis的代码,你记得语法吗?用redis什么什么来着记不清了(两年前的项目了,好久没碰springboot了),还有用springboot提供的一个缓存抽象模块,用注解的方式使用redis(也是忘得差不多了)。29.&nbsp;用注解的方式你会设置哪些参数?k和v,过期时间30.&nbsp;你另一个项目你负责什么?31.&nbsp;这里涉及到最短和次优线路;对,那个算法我写的32.&nbsp;简单的介绍一下这个算法。答的挺差的33.&nbsp;时间复杂度多少?n^2吧34.&nbsp;深度搜索n^2就可以搞定吗?没算过35.&nbsp;怎么判断是最短路径?36.&nbsp;深度搜索的关键条件或者逻辑是什么?37.&nbsp;我应该找一道深度搜索题给你做一下。(不要啊)38.&nbsp;开发接口是怎么设计的,输出的是什么东西?39.&nbsp;有了解过,接口开发规范吗?40.&nbsp;开发时,回去考虑冥等性的41.&nbsp;数据库设计的范式有了解吗?42.&nbsp;java多线程事务有用过吗?手撕代码。三部分和:给一个数组int[]&nbsp;test&nbsp;=&nbsp;new&nbsp;int[]{3,&nbsp;1,&nbsp;4&nbsp;,2,2&nbsp;,1&nbsp;,3&nbsp;,1},定义i=2,j=5&nbsp;要求下标i左边数组,i、j包围的数组,j右边的数组和相同(不包括下标为i,j的数组元素),如[3,1],[2,2],[3,1]数组和相同10.19:技术二面:周六傍晚面的,估计面试官赶着下班+看到是应届生,问的比较简单。我没怎么记录。首先手撕leetcode113.&nbsp;路径总和&nbsp;II问了几个八股,慢sql,和项目的redis干嘛的,记不大清了。一二面评级不一致,过两天还有技术三面,估计是狠狠拷打了。10.25更新:10.24:三面1.&nbsp;自我介绍2.&nbsp;你掌握技术比较扎实的是哪些?3.&nbsp;Java&nbsp;sdk大量的库,你哪块用的比较多?4.&nbsp;你对这一块整体有什么了解,有没有对java集合做整体的学习(问的应该是List,Map之类的接口和实现之类的架构)5.&nbsp;list,set,map特性和适用场景(项目中的场景)6.&nbsp;这里面哪些是线程安全的7.&nbsp;你基于什么判断哪一块用这个(arraylist,linkedlist,hashmap...)是比较合适的。8.&nbsp;mysql这里你主要做设计,还是相关的开发或者优化之类的?9.&nbsp;数据库设计这里有什么经验?10.&nbsp;有了解数据库的范式吗?(有了解,但不知道QAQ)11.&nbsp;比如说第一范式,具体设计有实例吗12.&nbsp;写sql的相关经验介绍下13.&nbsp;为什么用left&nbsp;join14.&nbsp;还有什么其他join&nbsp;介绍下15.&nbsp;sql有哪几部分组成的,写sql时要注意什么?16.&nbsp;where过滤时重点关注哪些?17.&nbsp;如何创建索引,使where条件尽量命中索引?18.&nbsp;有哪些类型的索引?19.&nbsp;sql哪些写法可能导致走不了索引?20.&nbsp;你有用过java的多线程吗?21.&nbsp;处理runnble还有哪些方式可以创建线程?22.&nbsp;你用spring&nbsp;boot&nbsp;做什么?23.&nbsp;你的系统大概分几层,每层的作用?24.&nbsp;每层的上下游分别是什么?25.&nbsp;自学学习方法是什么(文档or视频),什么驱动去学习的?26.&nbsp;比如你拿到一个项目或需求,你如何判断你需要去学习哪些技能,这里涉及到你可能不知道你不知道的,如何解决?27.&nbsp;看开源的项目或框架你会去关注背后的原理吗?28.&nbsp;用出问题了怎么办?手撕leetcode22.&nbsp;括号生成29.&nbsp;你了解回溯算法吗?10.25:主管面:1.&nbsp;自我介绍2.&nbsp;项目介绍3.&nbsp;怎么防止超卖的4.&nbsp;qps怎么得出的5.&nbsp;如何判断有没有超卖?之后项目问题都省略吧反问&nbsp;加班,技术栈,导师。面完hr告知定级d2。下周走审批流程。技术面前的hr面要了d1平均的薪资,结果定级d2,薪资主管拍板给了d1平均,建议各位在前期多要点
查看49道真题和解析
点赞 评论 收藏
分享
深圳联通 解决方案岗 16-18万
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-20 01:32
追觅科技 自动驾驶算法工程师 18k*13~15 硕士985
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务