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

server/2025/2/6 23:20:38/

pythonjavacjsc_0">【华为OD-E卷 - 数组组成的最小数字 100分(pythonjava、c++、js、c)】

题目

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

输入描述

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

输出描述

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

用例

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

python_51">python解法

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

如果数组长度小于 3

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

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

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

python">from itertools import permutationsdef 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_88">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) 将排序后的字符串列表合并,得到最终结果

java">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” 应该在前。
拼接字符串

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

javascript">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.ppmy.cn/server/165529.html

相关文章

解决运行npm时报错

在运行一个Vue项目时报错&#xff0c;产生下面问题 D:\node\npm.cmd run dev npm WARN logfile could not be created: Error: EPERM: operation not permitted, open D:\node\node_cache\_logs\2025-01-31T01_01_58_076Z-debug-0.log npm WARN logfile could not be created:…

P3367 【模板】并查集

洛谷 #include<bits/stdc.h> using namespace std; const int N 1e6 7; int fa[N]; int n, m; int find(int x) {if(fa[x] x) return x;return fa[x] find(fa[x]); } void unionset(int x, int y) {fa[find(x)] find(y); } int main() {cin >> n >> m;…

【使用Apache Flink 实现滑动窗口流式计算】

什么是Flink&#xff1f; Apache Flink是一个用于分布式流式处理和批处理的开源实时计算引擎。它具备低延迟、高吞吐量和 exactly-once 语义的特点&#xff0c;适用于各种实时数据处理场景。 Flink的核心概念 作业&#xff08;Job&#xff09;&#xff1a;Flink程序的执行单…

MySQL UNION 操作详解

MySQL UNION 操作详解 引言 在数据库操作中,UNION 是一个非常重要的概念,它允许我们在一个查询中合并多个 SELECT 语句的结果集。UNION 操作通常用于将来自不同表的数据合并在一起,或者将同一表中的数据按照不同的条件进行合并。本文将详细介绍 MySQL 中的 UNION 操作,包…

ollama部署deepseek实操记录

1. 安装 ollama 1.1 下载并安装 官网 https://ollama.com/ Linux安装命令 https://ollama.com/download/linux curl -fsSL https://ollama.com/install.sh | sh安装成功截图 3. 开放外网访问 1、首先停止ollama服务&#xff1a;systemctl stop ollama 2、修改ollama的servic…

试试DeepSeek写prompt+stable diffusion生成漫画

#deepseek #stable diffusion 模型&#xff1a;dreamshaperXL_v21TurboDPMSDE.safetensors 一、情节拟定 漫画情节由deepseek自编自导&#xff0c;画幅为四张。 Prompt 1: 魔法觉醒 "一个平凡的少年在阁楼发现一本古老的魔法书&#xff0c;书页散发着微弱的蓝光。画…

wordpress安装

安装WordPress安装包&#xff0c;解压缩&#xff0c;安装到指定位置安装php环境&#xff1a; 下载&#xff1a;sudo yum install php php-fpm php-mysqlnd安装&#xff1a;sudo systemctl start php-fpmsudo systemctl enable php-fpm检测&#xff1a;php -v查询状态&#xff1…

05. Springboot admin集成Actuator(一)

目录 1、前言 2、Actuator监控端点 2.1、健康检查 2.2、信息端点 2.3、环境信息 2.4、度量指标 2.5、日志文件查看 2.6、追踪信息 2.7、Beans信息 2.8、Mappings信息 3、快速使用 2.1、添加依赖 2.2、添加配置文件 2.3、启动程序 4、自定义端点Endpoint 5、自定…