当前位置: 首页 > article >正文

【华为OD-E卷 - 115 数组组成的最小数字 100分(python、java、c++、js、c)】

【华为OD-E卷 - 数组组成的最小数字 100分(python、java、c++、js、c)】

题目

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

输入描述

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

输出描述

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

用例

用例一:
输入:
21,30,62,5,31
输出:
21305
用例二:
输入:
5,21
输出:
215

python解法

  • 解题思路:
  • 本题的目标是从字符串数组 arr 中选出 3 个元素,并组合成最小的数字。我们采用全排列的方法来解决,具体步骤如下:

如果数组长度小于 3

直接对数组进行排序,并拼接成字符串返回(因为所有元素都需要用上,排序后拼接保证最小)。
生成所有可能的 3 元素排列

使用 itertools.permutations(arr, 3) 生成 arr 中所有长度为 3 的排列。
通过 ‘’.join§ 将排列的元组转换为字符串,并转换成整数,以便进行比较。
找到最小的组合

使用 min() 获取所有排列组合中的最小值,并转换为字符串返回

from itertools import permutations

def smallest_number(arr):
    # 如果数组长度小于3,则直接对数组排序并拼接
    if len(arr) < 3:
        return ''.join(sorted(arr))
    
    # 生成所有可能的 3 个元素的排列,并找出最小的组合
    min_number = min(int(''.join(p)) for p in permutations(arr, 3))
    
    return str(min_number)

# 读取输入,按逗号分割成数组
strs = input().split(",")

# 输出最小的组合数字
print(smallest_number(strs))

java解法

  • 解题思路
  • 本题的目标是从字符串数组 strs 中选出 3 个最小的元素,并按照最小的拼接方式组合成字符串。具体实现步骤如下:

按照数值大小排序

先将 strs 中的字符串转换为整数,并按数值大小排序(Integer::parseInt)。
取出 最小的 3 个元素。
按拼接结果排序

对这 3 个元素进行自定义排序:
比较 a + b 和 b + a,如果 a + b 小于 b + a,则 a 应该排在 b 前面。
例如,“30” 和 “3”,因为 “303” < “330”,所以 “30” 应该在前。
拼接字符串

通过 String.join(“”, sortedList) 将排序后的字符串列表合并,得到最终结果

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strs = sc.nextLine().split(","); // 读取输入并按逗号分割
        System.out.println(findResult(strs)); // 计算结果并输出
    }

    public static String findResult(String[] strs) {
        // 先按照数值大小排序,并取最小的 3 个元素
        List<String> sortedList = Arrays.stream(strs)
                .sorted(Comparator.comparingInt(Integer::parseInt)) // 数值排序
                .limit(3) // 取最小的 3 个元素
                .sorted((a, b) -> (a + b).compareTo(b + a)) // 按拼接结果排序
                .collect(Collectors.toList());

        // 拼接排序后的字符串列表并返回
        return String.join("", sortedList);
    }
}

C++解法

  • 解题思路
  • 本题的目标是从字符串数组 strs 中选出 3 个最小的元素,并按照最小的拼接方式组合成字符串。具体步骤如下:

按数值大小排序

将 strs 中的字符串转换为整数,并按数值大小排序(使用 stoi(a) < stoi(b) 进行比较)。
这样可以确保最小的 3 个数字被选中。
取出最小的 3 个元素,并按拼接规则排序

选取排序后的前 3 个元素(如果 strs 长度小于 3,则全部选取)。
按照拼接规则排序:
比较 a + b 和 b + a,如果 a + b 小于 b + a,则 a 应该排在 b 前面。
例如,“30” 和 “3”,因为 “303” < “330”,所以 “30” 应该在前。
拼接字符串

依次将排序后的字符串连接在一起,形成最终的最小组合

#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;

string findResult(vector<string>& strs) {
    // 按照数值大小排序
    sort(strs.begin(), strs.end(), [](const string& a, const string& b) {
        return stoi(a) < stoi(b); // 将字符串转换为整数并比较大小
    });

    // 取前3个元素(如果不足3个,则取所有)
    vector<string> sortedList(strs.begin(), strs.begin() + min(3, (int)strs.size()));

    // 按拼接规则排序,确保最小的拼接顺序
    sort(sortedList.begin(), sortedList.end(), [](const string& a, const string& b) {
        return (a + b) < (b + a); // 按照字符串拼接后的字典序进行比较
    });

    // 拼接排序后的字符串列表
    string result;
    for (const string& s : sortedList) {
        result += s;
    }

    return result;
}

int main() {
    string input;
    getline(cin, input); // 读取整行输入

    stringstream ss(input);
    string token;
    vector<string> strs;

    // 按逗号分割输入
    while (getline(ss, token, ',')) {
        strs.push_back(token);
    }

    // 输出结果
    cout << findResult(strs) << endl;

    return 0;
}

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

  • 本题的目标是从输入的字符串数组 strs 中选出 3 个最小的元素,并按照最小的拼接方式组合成字符串。具体步骤如下:

过滤非数字字符串

通过 isNaN(parseInt(str)) 过滤掉无法转换为数字的字符串,确保输入是有效的数字字符串。
按数值大小排序

将 strs 转换为整数,并按照数值大小升序排序(parseInt(a) - parseInt(b))。
这样可以确保最小的 3 个数字被选中。
取出最小的 3 个元素,并按拼接规则排序

选取排序后的前 3 个元素(如果 strs 长度小于 3,则全部选取)。
按照拼接规则排序:
比较 a + b 和 b + a 的字典序,确保最小的拼接顺序。
例如,“30” 和 “3”,因为 “303” < “330”,所以 “30” 应该在前。
拼接字符串

依次将排序后的字符串连接在一起,形成最终的最小组合

const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

rl.on("line", (line) => {
    const strs = line.split(","); // 读取输入并按逗号分割
    console.log(findResult(strs)); // 计算结果并输出
});

function findResult(strs) {
    // 过滤掉非数字项,并按数值大小排序
    strs = strs.filter(str => !isNaN(parseInt(str))) // 过滤无效输入
        .sort((a, b) => parseInt(a) - parseInt(b)) // 数值排序
        .slice(0, 3) // 取最小的 3 个元素
        .sort((a, b) => (a + b).localeCompare(b + a)); // 按拼接顺序排序

    // 拼接排序后的字符串并返回
    return strs.join('');
}

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


http://www.kler.cn/a/533949.html

相关文章:

  • 【学Rust写CAD】3 绝对坐标系详解
  • 一文讲解Spring如何解决循环依赖
  • 记录一次-Rancher通过UI-Create Custom- RKE2的BUG
  • Node.js与嵌入式开发:打破界限的创新结合
  • Baklib探讨如何通过内容中台提升组织敏捷性与市场竞争力
  • 如何使用C#的using语句释放资源?什么是IDisposable接口?与垃圾回收有什么关系?
  • C# Action和 Func的用法
  • [操作系统] 进程终止
  • 大模型 Llama 微调如何适配中文_词表扩展
  • 如何开发一个大语言模型,开发流程及需要的专业知识
  • 【数学】矩阵、向量(内含矩阵乘法C++)
  • Ubuntu22.04如何设置linux-lowlatency核心
  • 扩增子分析|零模型2——基于βNTI的微生物随机性和确定性装配过程(箱线图和柱状图R中实现)
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_sprintf_num 函数
  • 2024年Web前端最新Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(1),面试必备
  • 高压GaN(氮化镓)器件在工业和汽车应用存在的致命弱点
  • git 设置分支跟踪
  • Nginx通过设置自定义标记识别代理调用
  • VMware Win10下载安装教程(超详细)
  • 《手札·开源篇》基于开源Odoo软件与Deepseek的智能企业管理系统集成方案
  • R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框
  • Noise Conditional Score Network
  • 玩转goroutine:Golang中对goroutine的理解
  • 多用户同时RDP登入Win10
  • 大型三甲医院算力网络架构的深度剖析与关键技术探索
  • JAVA 二维列表的基础操作与异常