首页 > 其他分享 >数组组成的最小数字 - 华为OD统一考试(E卷)

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

时间:2024-09-23 10:50:14浏览次数:3  
标签:arr OD int 元素 最小 华为 数组 最小值

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;
        }


        // 三个元素的全排列组合,找到最小值
        long result = Long.MAX_VALUE;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (i == j) continue;
                for (int k = 0; k < n; k++) {
                    if (i == k || j == k) continue;

                    // 将三个数字组合成一个字符串,再转化为 long 值进行比较
                    String s = arr[i] + arr[j] + arr[k];
                    result = Math.min(result, Long.parseLong(s));
                }
            }
        }

        // 输出最终的最小值结果
        System.out.println(result);
    }
}

Python

def solve():
    # 从标准输入读取数据
    arr = input().split(",")
    n = len(arr)

    # 只有一个元素时,直接输出
    if n == 1:
        print(arr[0])
    # 如果有两个元素,则比较两种组合,输出最小值
    elif n == 2:
        s1, s2 = arr[0], arr[1]
        print(min(int(s1 + s2), int(s2 + s1)))
    else:
        # 三个元素的全排列组合,找到最小值
        result = float('inf')  # 设置初始值为无穷大
        for i in range(n):
            for j in range(n):
                if i == j:
                    continue
                for k in range(n):
                    if i == k or j == k:
                        continue

                    # 将三个数字组合成一个字符串,再转化为整数进行比较
                    s = arr[i] + arr[j] + arr[k]
                    result = min(result, int(s))

        # 输出最终的最小值结果
        print(result)


if __name__ == "__main__":
    solve()

C++

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
    vector<int> arr;
    int num;
    while (cin >> num) {
        arr.push_back(num);
        if (cin.peek() == '\n') break;
        cin.ignore();
    }

    int n = arr.size();
    // 只有一个元素时
    if (n == 1) {
        cout << arr[0] << endl;
        return 0;
    }

    // 两个元素组成数字
    if (n == 2) {
        string s1 = to_string(arr[0]), s2 = to_string(arr[1]);
        cout << min(stoll(s1 + s2), stoll(s2 + s1)) << endl;
        return 0;
    }

    long long result = LONG_LONG_MAX;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j) continue;
            for (int k = 0; k < n; k++) {
                if (i == k || j == k) continue;

                // 三个元素组成数字
                string s = to_string(arr[i]) + to_string(arr[j]) + to_string(arr[k]);
                result = min(result, stoll(s));
            }
        }
    }

    cout << result << endl;

    return 0;
}
    

相关练习题

题号题目难易
LeetCode 179179. 最大数中等
LeetCode 321321. 拼接最大数困难

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。

标签:arr,OD,int,元素,最小,华为,数组,最小值
From: https://blog.csdn.net/user_longling/article/details/142453113

相关文章

  • FIT3158 Business Decision Modelling
    MonashUniversityFacultyofInformationTechnology2ndSemester2024FIT3158BusinessDecisionModellingAssignment2:LinearProgramming,IntegerLinearProgramming,NetworkAnalysis,Transportation,TransshipmentandEconomicOrderQuantity(EOQ)-us......
  • NodeRed+UIOTOS绝配!流程连线搭建上位机 一
    介绍NodeRed:后端低代码,用于协议接入、边缘计算采集。UIOTOS:前端零代码,用于组态绘图、UI表单、界面交互。作为低代码的一个成功典范,NodeRed如今在IoT物联网、工业互联网、自动化等领域势不可挡,甚至引起了流程编辑的浪潮。nodered节点编辑尽管在协议对接、边缘计算上,NodeRed是扛把子,......
  • AtCoder Beginner Contest 372 补题记录
    A-delete题意:输出删除字符串中.后的字符串思路:只输出字符串中不是.的字符voidsolve(){strings=sread();for(autoit:s)if(it!='.')cout<<it;cout<<endl;}B-3^A题意:给出M,求将M拆分成N个3的\(A_i\)次方相加思路:贪心,从大到小用......
  • AOT源码解析4.1-model主体解析
    1输入数据VOS的数据集处理操作可见数据集操作,这里是进行数据集提取完毕后的操作。图2:如图所示,使用datasets提取出数据之后,在模型训练阶段对数据做图中操作。即:将batch_size大小的ref_imgs、prev_imgs,和3batch_size大小的curr_imgs在通道维度上进行合并。如图例,batch_si......
  • Modbus轮询,状态可以看得见
    01前言本文章原文发表于我的微信公众号,请大家关注阅读,涉及的源代码等都在公众号,请搜索公众号: 智能家居NodeRed和HomeAssistant 即可关注。02 概述前面发布的Modbus解析流程,对于多从站都是采用Inject节点周期性执行的方式进行轮询,我一直不满意这种方式,于是就思考有没有更......
  • 《让手机秒变超级电脑!ToDesk云电脑、易腾云、青椒云移动端评测》
    前言科技发展到如今2024年,可以说每一年都在发生翻天覆地的变化。而云上这个词时常都被大家提起,从个人设备连接到云端在如今在也不是梦了。而云电脑这个市场近年来迅速发展,无需购买和维护额外的硬件就可以体验到电脑端顶配的性能和体验,并且移动端也可以带来非凡体验。我们......
  • 计算机低能儿从0刷leetcode | 11.盛最多水的容器
    题目:11.盛最多水的容器解答:不想暴力遍历,于是让右端点j从最右侧开始遍历,每次寻找离j最远、且高度不小于height[j]的左端点i,结果发现错误,比如[1,2]的情况。于是又打补丁,按同样思路左端点i从0开始遍历,每次寻找离i最远、且高度不小于height[i]的右端点j,结果正确,然而时间复杂度......
  • codeforces 1041 C. Coffee Break
    题意第一行输入三个整数\(n,m,d(1\leqn\leq2*10^5,n\leqm\leq10^9,1\leqd\leqn)\),第二行输入\(n\)个整数,保证每个数均不大于\(m\)。在每一天你都可以任意选择一个未选过的数\(a_i\),随后可以继续选任意一个大于\(a_i+d\)的数\(a_j\);接下来可以再选任意......
  • Podcast Subtitles AI Generator All In One
    PodcastSubtitlesAIGeneratorAllInOne播客字幕AI生成器???TranscribePodcasttoTexthttps://www.youtube.com/watch?v=WVhcmJl4ZFwhttps://video.adorilabs.com/https://www.youtube.com/watch?v=h5AEXBS5lf0https://www.media.io/transcribe-podcast-to-texts......
  • 数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点
    328.奇偶链表题目描述328.奇偶链表给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输......