【华为OD】MVP争夺战2(C++、Java、Python)

文章目录

  • 题目
    • 题目描述
    • 输入描述
    • 输出描述
    • 示例
  • 思路
    • 核心思路:
    • 关键观察:
    • 算法步骤:
    • 排序策略:
    • 特殊情况处理:
  • 代码
    • C++
    • Java
    • Python
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目描述

给定一个整型数组,请从该数组中选择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为最小值。

题目链接🔗

思路

这是一个数字组合优化问题,需要找到能组成最小数字的策略:

核心思路:

  1. 数组长度 < 3: 直接使用所有元素
  2. 数组长度 ≥ 3: 选择3个元素,使组成的数字最小

关键观察:

  • 要让组成的数字最小,需要考虑两个因素:
    1. 数字位数越少越好
    2. 高位数字越小越好

算法步骤:

  1. 数字排序: 按数值大小升序排列,选择前3个较小的数字
  2. 组合排序: 对选中的数字按照拼接结果的字典序排序
  3. 拼接输出: 将排序后的数字拼接成最终结果

排序策略:

关键在于第二步的排序规则:对于两个数字 a 和 b,如果 a+b < b+a(字符串拼接比较),则 a 应该排在 b 前面。

例如:

  • 数字 21 和 30:比较 “2130” 和 “3021”,因为 “2130” < “3021”,所以 21 排在 30 前面
  • 数字 30 和 5:比较 “305” 和 “530”,因为 “305” < “530”,所以 30 排在 5 前面

特殊情况处理:

  • 数组长度 < 3 时,直接对所有元素按组合规则排序
  • 数组长度 ≥ 3 时,先选择数值最小的3个元素,再按组合规则排序

代码

C++

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX_SIZE 100int cmp1(const void* a, const void* b) {int A;sscanf(*(char**) a, "%d", &A);int B;sscanf(*(char**) b, "%d", &B);return A - B;
}int cmp2(const void* a, const void* b) {char* A = *((char**) a);char* B = *((char**) b);char AB[10000] = {'\0'};strcat(AB, A);strcat(AB, B);char BA[10000] = {'\0'};strcat(BA, B);strcat(BA, A);return strcmp(AB, BA);
}int main() {char line[10000];gets(line);char* ss[MAX_SIZE];int ss_size = 0;char* token = strtok(line, ",");while(token != NULL) {ss[ss_size++] = token;token = strtok(NULL, ",");}qsort(ss, ss_size, sizeof(char*), cmp1);int size = MIN(3, ss_size);qsort(ss, size, sizeof(char*), cmp2);char res[10000];for(int i=0; i<size; i++) {strcat(res, ss[i]);}puts(res);return 0;
}

Java

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] strs = sc.nextLine().split(",");System.out.println(getResult(strs));}public static String getResult(String[] strs) {// 按数值大小升序排列Arrays.sort(strs, (a, b) -> Integer.parseInt(a) - Integer.parseInt(b));// 取前3个元素(如果数组长度小于3,则取所有元素)String[] tmp = Arrays.copyOfRange(strs, 0, Math.min(3, strs.length));// 按照拼接结果的字典序排序Arrays.sort(tmp, (a, b) -> (a + b).compareTo(b + a));StringBuilder sb = new StringBuilder();for (String s : tmp) {sb.append(s);}return sb.toString();}
}

Python

import functools# 输入获取
strs = input().split(",")# 自定义比较函数
def cmp(a, b):s1 = a + bs2 = b + areturn 0 if s1 == s2 else 1 if s1 > s2 else -1def getResult(strs):# 按数值大小升序排列strs.sort(key=lambda x: int(x))# 取前3个元素tmp = strs[:3]# 按照拼接结果的字典序排序tmp.sort(key=functools.cmp_to_key(cmp))return "".join(tmp)# 算法调用
print(getResult(strs))

复杂度分析

时间复杂度

  • 第一次排序: O(n log n) - 按数值大小排序
  • 第二次排序: O(k log k),其中 k = min(3, n) - 按组合规则排序
  • 总时间复杂度: O(n log n)

空间复杂度

  • 辅助数组: O(k),其中 k = min(3, n) - 存储选中的元素
  • 字符串拼接: O(L),其中 L 是数字的总长度
  • 总空间复杂度: O(n)

结果

通过所有测试用例,算法能够正确处理各种输入情况:

  • 数组长度小于3的情况
  • 数组长度等于3的情况
  • 数组长度大于3的情况

总结

本题是一个典型的贪心算法问题,关键在于:

  1. 贪心策略: 选择数值最小的3个元素,保证组成数字的位数最少
  2. 排序技巧: 使用自定义比较器,通过字符串拼接比较来确定最优排列
  3. 边界处理: 正确处理数组长度小于3的特殊情况

这道题目考查了:

  • 贪心算法的应用
  • 自定义排序比较器的使用
  • 字符串处理技巧
  • 边界条件的处理

通过这道题可以加深对贪心算法和排序算法的理解,特别是如何设计合适的比较函数来解决复杂的排序问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89014.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python打卡训练营Day58

DAY 58 经典时序预测模型2知识点回顾&#xff1a;时序建模的流程时序任务经典单变量数据集ARIMA&#xff08;p&#xff0c;d&#xff0c;q&#xff09;模型实战SARIMA摘要图的理解处理不平稳的2种差分n阶差分---处理趋势季节性差分---处理季节性建立一个ARIMA模型&#xff0c;通…

003大模型基础知识

大模型分类&#xff1a; 技术架构&#xff1a; Encoder Only Bert Decoder Only 著名的大模型都是 Encoder - Decoder T5 是否开源&#xff1a; 开源阵营&#xff1a; Llama DeepSeek Qwen 闭源阵营&#xff1a; ChatGpt Gemini Claude 语言模型发展阶段&am…

JVM监控及诊断工具-GUI篇

19.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限&#xff1a; 1&#xff0e;无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等&#xff08;这对定位应用性能瓶颈…

适用于Windows系统截图工具

1.Faststone Capture 官网网址&#xff1a;https://faststone-capture.com/ 网上很多注册码&#xff1a;https://www.cnblogs.com/LiuYanYGZ/p/16839503.html 2.Snipaste 官网网址&#xff1a;https://apps.microsoft.com/detail/9p1wxpkb68kx?launchtrue&modefull&…

区块链的三种共识机制——PoW、PoS和DPoS原理

区块链的核心是去中心化网络的信任机制&#xff0c;而共识机制是实现这一目标的关键。共识机制可分为两个阶段&#xff1a;&#xff08;1&#xff09;提出共识内容&#xff08;2&#xff09;对内容达成共识&#xff08;遵循最长链原则&#xff09;。三种主流的共识机制主要有工…

React 和 Vue的自定义Hooks是如何实现的,如何创建自定义钩子

目的&#xff1a;将公共逻辑提取出来&#xff0c;类似于 mixin&#xff0c;解决了mixin的设计缺陷。 React 和 Vue 自定义 Hooks 实现对比 React 自定义 Hooks React 的自定义 Hooks 是 JavaScript 函数&#xff0c;它们以 use 开头&#xff0c;可以调用其他 Hooks。 基本规则 …

构建高效事件驱动架构:AWS S3与SQS集成实践指南

引言 在现代云架构中,事件驱动的设计模式越来越受到开发者的青睐。AWS S3与SQS的集成为我们提供了一个强大的事件处理机制,能够在文件上传、删除或修改时自动触发后续的业务逻辑。本文将详细介绍如何配置S3事件通知到SQS队列,并分享实际项目中的最佳实践。 架构概述 S3事…

C++ -- STL-- List

////// 欢迎来到 aramae 的博客&#xff0c;愿 Bug 远离&#xff0c;好运常伴&#xff01; ////// 博主的Gitee地址&#xff1a;阿拉美 (aramae) - Gitee.com 时代不会辜负长期主义者&#xff0c;愿每一个努力的人都能达到理想的彼岸。1. list的介绍及使用 2. list的深度剖…

rt-thread 线程间同步方法详解

rt-thread 线程间同步方法详解一、什么是线程间同步线程同步的必要性线程同步的挑战二、同步方式1、信号量信号量工作机制信号量的管理方式信号量的创建与删除信号量的获取与释放信号量的典型应用场景信号量的注意事项2、互斥量互斥量工作机制互斥量的特性互斥量的操作接口互斥…

Spring Boot + Vue2 实现腾讯云 COS 文件上传:从零搭建分片上传系统

目录 一、项目目标 二、腾讯云 COS 基本配置 1. 创建存储桶 2. 获取 API 密钥 3. 设置跨域规则&#xff08;CORS&#xff09; 三、后端&#xff08;Spring Boot&#xff09;实现 1. 依赖配置 2. 配置腾讯云 COS&#xff08;application.yml&#xff09; 3. 初始化 COS…

使用 Java 获取 PDF 页面信息(页数、尺寸、旋转角度、方向、标签与边框)

目录 引言 一、安装和引入PDF处理库 二、获取 PDF 页数 三、获取页面尺寸&#xff08;宽高&#xff09; 四、获取页面旋转角度 五、判断页面方向&#xff08;横向 / 纵向&#xff09; 六、获取页面标签 七、获取页面边框信息 八、总结 引言 了解 PDF 页面属性是我们在…

基于 AI 的大前端安全态势感知与应急响应体系建设

大前端应用&#xff08;Web、APP、小程序&#xff09;作为用户交互的入口&#xff0c;面临日益复杂的安全威胁&#xff1a;从传统的 XSS 攻击、CSRF 伪造&#xff0c;到新型的供应链投毒、AI 驱动的自动化爬虫&#xff0c;再到针对业务逻辑的欺诈攻击&#xff08;如薅羊毛、账号…

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践

文章目录一、引言二、InnoDB引擎下的全文检索功能详解2.1 全文索引的基本概念与原理2.2 全文索引的创建与管理2.3 全文检索的三种查询模式2.4 中文全文检索的挑战与解决方案三、CMS 场景下的全文检索性能瓶颈分析3.1 索引构建与维护开销3.2 查询性能瓶颈3.3 锁机制与并发性能问…

应用软件格式渗透 利用word去渗透(MS10-087)

用到的靶机为&#xff1a;WinXP漏洞原理&#xff1a;一、漏洞触发机制与核心组件 漏洞根源&#xff1a;RTF文件解析逻辑缺陷 触发组件&#xff1a;Microsoft Word的RTF&#xff08;Rich Text Format&#xff09;解析引擎&#xff0c;具体涉及 mso.dll 模块中的 路径规范化函数&…

解密AWS VPC路由表:显式关联与隐式关联,谁决定了网络出口?

大家好&#xff0c;今天我们来聊一个在 AWS 云计算世界里既基础又关键的话题&#xff1a;VPC 路由表。 很多刚接触 AWS 的朋友&#xff0c;在配置网络时可能会遇到这样的困惑&#xff1a;为什么我的 EC2 实例无法访问互联网&#xff1f;为什么某些子网的网络策略和其他子网不一…

LeetCode题解---<203.移除链表元素>

文章目录题目代码及注释关键点题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,…

【JavaScript高级】构造函数、原型链与数据处理

目录构造函数和原型构造函数实例成员和静态成员构造函数的问题构造函数原型 prototype对象原型 \_\_proto\_\_constructor 构造函数构造函数、实例、原型对象三者之间的关系原型链JavaScript 的成员查找机制&#xff08;规则&#xff09;原型对象的this指向扩展内置对象继承cal…

项目进度与预算脱节,如何进行同步管理

项目进度与预算脱节会导致资源浪费、成本超支和项目延期。进行同步管理的方法包括&#xff1a;建立统一的项目进度预算管理体系、实施实时监控与反馈机制、采用项目管理工具辅助同步管理。尤其是实施实时监控与反馈机制&#xff0c;通过持续监测进度与预算的匹配情况&#xff0…

TCP半关闭

理解TCP半关闭&#xff1a;像水管一样的网络连接控制 从全关闭到半关闭&#xff1a;为什么需要这种机制&#xff1f; 想象你和朋友正在通电话讨论一个重要项目&#xff1a; 全关闭&#xff1a;就像突然挂断电话&#xff0c;双方都无法再说话半关闭&#xff1a;你说"我说完…

衡石科技技术手册--仪表盘过滤控件详解

过滤控件说明 过滤控件 的定义 过滤控件用于在仪表盘中过滤图表数据&#xff0c;分为仪表盘内过滤控件和全局过滤控件。 过滤控件结构说明 字段类型描述uidSTRING过滤控件唯一识别 idappIdLONG过滤控件所属的应用 iddataAppIdLONG字段来源是数据包时的数据包 iddashboar…