华为OD机试E卷 ---最大值
一、题目描述
给定一组整数(非负),重排顺序后输出一个最大的整数。
二、示例1
用例1
输入
10 9
输出
910
说明:输出结果可能非常大,所以你需要返回一个 字符串只而不是整数。
三、输入描述
数字组合
四、输出描述
最大的整数
五、解题思路
-
字符串转换:
- 首先,将整数数组中的每个元素转换为字符串,以便进行字符串比较和拼接。
-
自定义排序:
- 使用自定义的比较器对字符串数组进行排序。比较规则是:对于任意两个字符串
a和b,比较a + b和b + a的大小。 - 如果
a + b大于b + a,则a应该排在b前面,以形成更大的数字。 - 反之,如果
a + b小于b + a,则b应该排在a前面。 - 如果两者相等,则保持相对顺序不变(或者可以根据具体实现选择任意一种顺序,因为不影响最终结果)。
- 使用自定义的比较器对字符串数组进行排序。比较规则是:对于任意两个字符串
-
处理特殊情况:
- 排序后,如果数组的第一个元素是"0",则需要检查数组中是否全部为"0"。
- 如果全部为"0",则直接返回"0"。
- 如果不是全部为"0",但由于某些数字(如0)的存在,在排序后可能导致结果不是以最大数字开头(尽管这种情况在题目给定的非负整数范围内不太可能,但作为一种健壮性考虑),仍然需要按照排序后的结果拼接。
- 实际上,在题目给定的非负整数范围内,只要正确实现了自定义排序,就不会出现以非最大数字开头的情况。
-
拼接结果:
- 将排序后的字符串数组使用
StringBuilder或简单的字符串拼接操作合并成一个结果字符串。
- 将排序后的字符串数组使用
-
返回结果:
- 返回拼接后的结果字符串作为最终输出。
六、代码实现(python)
from functools import cmp_to_keydef largest_number(nums):# 自定义比较函数,用于确定两个数字拼接后的顺序def compare(x, y):# 将数字转换为字符串,并比较它们拼接后的结果xy = str(x) + str(y)yx = str(y) + str(x)# 根据拼接后的字符串比较大小if xy > yx:return -1 # x应该排在y前面elif xy < yx:return 1 # y应该排在x前面else:return 0 # x和y拼接后的结果相等# 将数字列表转换为字符串列表,以便排序nums_str = list(map(str, nums))# 使用自定义的比较函数对字符串列表进行排序nums_str.sort(key=cmp_to_key(compare))# 将排序后的字符串列表拼接成一个字符串result = ''.join(nums_str)# 处理特殊情况:如果结果字符串以'0'开头(且不是整个字符串都是'0'),则去掉前面的'0'# 如果结果字符串全是'0',则返回'0'if result[0] == '0':return '0'# 返回最终结果return resultdef main():# 从用户获取输入input_str = input("请输入一组数字,用逗号分隔: ").strip()# 将输入字符串转换为整数列表try:nums = list(map(int, input_str.split(',')))except ValueError:print("输入格式错误,请输入一组用逗号分隔的数字。")return# 调用 largest_number 函数并输出结果result = largest_number(nums)print("最大拼接数字:", result)# 确保 main 方法只在直接运行脚本时执行
if __name__ == "__main__":main()# 测试用例
# print(largest_number([10, 9])) # 输出 "910"
# print(largest_number([3, 30, 34, 5, 9])) # 输出 "9534330"
# print(largest_number([1, 2, 3, 4, 5, 6, 7, 8, 9])) # 输出 "987654321"
# print(largest_number([0, 0])) # 输出 "0"
# print(largest_number([0, 0, 1])) # 输出 "100"
七、代码实现(java)
import java.util.Arrays;
import java.util.Comparator;public class LargestNumber {/*** 将一组整数重排顺序后输出一个最大的整数** @param nums 包含非负整数的数组* @return 由这些整数组成的最大数字的字符串表示*/public static String largestNumber(int[] nums) {// 将整数数组转换为字符串数组String[] numStrs = new String[nums.length];for (int i = 0; i < nums.length; i++) {numStrs[i] = String.valueOf(nums[i]);}// 自定义排序规则:比较两个字符串拼接的两种顺序,决定哪个顺序更大Arrays.sort(numStrs, new Comparator<String>() {@Overridepublic int compare(String a, String b) {String order1 = a + b;String order2 = b + a;return order2.compareTo(order1); // 降序排列}});// 如果排序后的第一个元素是"0",说明所有元素都是0,直接返回"0"if (numStrs[0].equals("0")) {return "0";}// 将排序后的字符串数组拼接成结果字符串StringBuilder largestNumber = new StringBuilder();for (String numStr : numStrs) {largestNumber.append(numStr);}return largestNumber.toString();}public static void main(String[] args) {int[] nums = {10, 9};System.out.println(largestNumber(nums)); // 输出: 910}
}
八、运行示例解析
测试用例
public static void main(String[] args) {int[] nums = {10, 9};System.out.println(largestNumber(nums)); // 输出: 910
}
解析步骤
-
初始化数组:
- 输入数组
nums为{10, 9}。
- 输入数组
-
转换为字符串数组:
- 方法内部,首先将整数数组转换为字符串数组
numStrs,得到{"10", "9"}。
- 方法内部,首先将整数数组转换为字符串数组
-
自定义排序:
- 使用
Arrays.sort方法和自定义的Comparator对字符串数组进行排序。 - 比较规则是:将两个字符串
a和b分别进行拼接,形成a + b和b + a,然后比较这两个拼接字符串的大小。 - 在本例中,比较
"10" + "9"和"9" + "10",即"109"和"910"。 - 由于
"910"大于"109",因此自定义比较器会判定"9"应该排在"10"前面。 - 排序后,
numStrs变为{"9", "10"}(但实际上,由于我们的比较规则是降序排列以形成最大数,排序后的结果应该直接满足这个顺序,这里的描述是为了说明比较过程)。
- 使用
-
处理特殊情况:
- 检查排序后的数组的第一个元素是否为
"0"。如果是,且数组中只包含零(虽然在这个特定例子中不是这种情况),则直接返回"0"。 - 在本例中,
numStrs[0]是"9",不是"0",因此不需要特殊处理。
- 检查排序后的数组的第一个元素是否为
-
拼接结果字符串:
- 使用
StringBuilder将排序后的字符串数组拼接成一个结果字符串。 - 在本例中,拼接后的结果是
"910"。
- 使用
-
返回结果:
- 方法返回拼接后的结果字符串
"910"。
- 方法返回拼接后的结果字符串
-
打印输出:
- 在
main方法中,打印调用largestNumber(nums)的返回值,输出为"910"。
- 在
九、注意事项
- 在自定义排序中,比较器返回的是
order2.compareTo(order1),这是因为我们想要实现的是降序排列以形成最大数。如果order2大于order1,则compare方法应该返回正数,表示b应该排在a前面(但在数组中实际上是a排在b的位置被交换到了后面,因为Arrays.sort默认是升序排序,我们通过返回负数的相反数来实现降序)。 - 在处理特殊情况时,由于题目要求非负整数,因此如果排序后的第一个元素是"0",则可以直接返回"0",无需进一步检查数组中是否包含其他非零元素(因为如果有其他非零元素,它们会在排序过程中被正确地放在"0"的前面)。但作为一种健壮性考虑,上述代码仍然检查了排序后的第一个元素是否为"0",并相应地返回了结果。在实际应用中,这种检查可能是多余的,具体取决于题目的严格要求和输入数据的范围。
相关文章:
华为OD机试E卷 ---最大值
一、题目描述 给定一组整数(非负),重排顺序后输出一个最大的整数。 二、示例1 用例1 输入 10 9输出 910说明:输出结果可能非常大,所以你需要返回一个 字符串只而不是整数。 三、输入描述 数字组合 四、输出描述 最大的整数 五、解题思路 字符…...
UllnnovationHub,一个开源的WPF控件库
目录 UllnnovationHub1.项目概述2.开发环境3.使用方法4.项目简介1.WPF原生控件1.Button2.GroupBox3.TabControl4.RadioButton5.SwitchButton6.TextBox7.PasswordBox8.CheckBox9.DateTimePicker10.Expander11.Card12.ListBox13.Treeview14.Combox15.Separator16.ListView17.Data…...
Fabric区块链网络搭建:保姆级图文详解
目录 前言1、项目环境部署1.1 基础开发环境1.2 网络部署 2、后台环境2.1、环境配置2.2、运行springboot项目 3、PC端3.1、安装依赖3.2、修改区块链网络连接地址3.3、启动项目 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加…...
Kubernetes (K8s) 权限管理指南
1. 引言 Kubernetes (K8s) 作为当今最流行的容器编排平台,其安全性至关重要。本指南旨在全面介绍 K8s 的权限管理机制,帮助具有一定基础的读者深入理解并掌握这一关键领域。 © ivwdcwso (ID: u012172506) 2. Kubernetes 安全模型概述 K8s 的安全模型主要包括三个阶段…...
IM聊天学习资源
文章目录 参考链接使用前端界面简单效果消息窗口平滑滚动至底部vue使用watch监听vuex中的变量变化 websocket握手认证ChatKeyCheckHandlerNettyChatServerNettyChatInitializer 参考链接 zzhua/netty-chat-web - 包括前后端 vue.js实现带表情评论功能前后端实现(仿…...
计算机视觉模型的未来:视觉语言模型
一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…...
【JAVA 基础 第(19)课】Hashtable 类用法和注意细节,是Map接口的实现类
Map接口:存放的是具有映射关系的键值对,键映射到值,键必须是唯一的 Hashtable 类,Map接口的实现类,键和值都不能为nullHashtable 是同步的,是线程安全的 public class MapTest {public static void main(String[] arg…...
浅谈 JVM
JVM 内存划分 JVM 内存划分为 四个区域,分别为 程序计数器、元数据区、栈、堆 程序计数器是记录当前指令执行到哪个地址 元数据区存储存储的是当前类加载好的数据,包括常量池和类对象的信息,.java 编译之后产生 .class 文件,运…...
html的iframe页面给帆软BI发送消息
需求:帆软的网页组件嵌套一个HTML页面,HTML页面要给帆软发消息。 解决方法是:fineReportWindow.duchamp.getWidgetByName("txt1").setValue(666); <!DOCTYPE html> <html lang"en"> <head> <…...
spark任务优化参数整理
以下参数中有sql字眼的一般只有spark-sql模块生效,如果你看过spark的源码,你会发现sql模块是在core模块上硬生生干了一层,所以反过来spark-sql可以复用core模块的配置,例外的时候会另行说明,此外由于总结这些参数是在不…...
C++ 模拟真人鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
生产环境中常用的设计模式
生产环境中常用的设计模式 设计模式目的使用场景示例单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点- 日志记录器- 配置管理器工厂方法模式定义一个创建对象的接口,让子类决定实例化哪个类- 各种工厂类(如视频游戏工厂模式创…...
基于SpringBoot+Vue的药品管理系统【源码+文档+部署讲解】
系统介绍 基于SpringBootVue实现的药品管理系统采用前后端分离的架构方式,系统实现了用户登录、数据中心、药库管理、药房管理、物资管理、挂号管理、系统管理、基础设置等功能模块。 技术选型 开发工具:idea2020.3Webstorm2020.3 运行环境ÿ…...
【CompletableFuture实战】
CompletableFuture实战 前言 前言 过去的一年,匆匆忙忙,换了一次工作,写博客的习惯就落下了,总之,有点懈怠。希望今年能重拾信心,步入正规! CompletableFuture的用法网上资料颇多,…...
Redis 缓存穿透、击穿、雪崩 的区别与解决方案
前言 Redis 是一个高性能的键值数据库,广泛应用于缓存、会话存储、实时数据分析等场景。然而,在高并发的环境下,Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能,还经常出…...
Python自动化测试中定位隐藏菜单元素的策略
大家都读完觉得有帮助记得关注和点赞!!! 在进行Python自动化测试时,尤其是使用Selenium等工具对Web应用进行测试时,可能会遇到某些元素被隐藏的问题。这使得元素定位和交互变得复杂。然而,通过一些技术手段…...
【张雪峰高考志愿填报】合集
【张雪峰高考志愿填报】合集 链接:https://pan.quark.cn/s/89a2d88fa807 高考结束,分数即将揭晓,志愿填报的关键时刻近在眼前!同学们,这可是人生的重要转折点,选对志愿,就像为未来铺就一条…...
53,【3】BUUCTF WEB october 2019 Twice SQLinjection
题目得到信息,2次注入,进入靶场 登录页面,很自然想到SQL 第一次注入应该是这个可以登录,注册,提交简介的页面 第二次注入应该是在info处注入,信息显示在简介处 我真的纯脑子有病,人家二次注入不…...
【Linux系统】分区挂载
我们能够根据一个 inode 号在指定分区寻找目标文件的 struct inode,也能根据目录文件的内容,通过映射关系,找指定的 inode,可是,现在有个问题: 问题:inode 是不能跨分区使用的!Linu…...
Oracle 可观测最佳实践
简介 Oracle 数据库是一种广泛使用的商业关系数据库管理系统(RDBMS),由甲骨文公司(Oracle Corporation)开发。它支持 SQL 语言,能够存储和管理大量数据,并提供高级数据管理功能,如数…...
告别官方包:手把手教你为遗留项目编译一个“增强版”Qt5.15.17
告别官方包:手把手教你为遗留项目编译一个“增强版”Qt5.15.17 当官方支持终止后,维护基于Qt5的遗留项目就像在悬崖边行走——你需要稳定性,但又渴望那些关键补丁和完整功能。本文将带你深入探索如何为团队构建一个功能完备的私有Qt工具链&am…...
如何5分钟制作超轻量Windows 11系统:Tiny11Builder终极指南
如何5分钟制作超轻量Windows 11系统:Tiny11Builder终极指南 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 想要体验一个干净、流畅、占用空间极小的W…...
PyTorch实战:从零构建ResNet50模型(CIFAR10训练+测试+ONNX转换)
1. ResNet50模型基础认知 第一次接触ResNet50时,我被它的"残差连接"设计惊艳到了。传统神经网络随着层数增加会出现梯度消失问题,而ResNet通过跨层直连通道,让信息能够无损传递到更深层。这就好比在高速公路上设置应急车道…...
YOLO_World+SAM+GraspNet在mujoco中的抓取仿真实战:从环境搭建到代码运行
YOLO_WorldSAMGraspNet在MuJoCo中的抓取仿真实战:从环境搭建到代码运行 在机器人抓取仿真领域,结合YOLO_World、SAM(Segment Anything Model)和GraspNet三大前沿技术,能够在MuJoCo物理引擎中实现高度逼真的物体识别、分…...
Nginx反向代理实战:不改代码轻松解决前后端跨域问题(附完整配置模板)
Nginx反向代理实战:不改代码轻松解决前后端跨域问题(附完整配置模板) 前后端分离架构已成为现代Web开发的主流模式,但随之而来的跨域问题却让不少开发者头疼。想象一下这样的场景:你的前端运行在https://frontend.com&…...
如何快速掌握扩散模型:PyTorch实现的终极指南
如何快速掌握扩散模型:PyTorch实现的终极指南 【免费下载链接】Diffusion-Models-pytorch Pytorch implementation of Diffusion Models (https://arxiv.org/pdf/2006.11239.pdf) 项目地址: https://gitcode.com/gh_mirrors/di/Diffusion-Models-pytorch 想要…...
当欧姆龙NX1P2遇上丰田PC10G:一次EIP实例ID通信的“踩坑”与“填坑”实录
当欧姆龙NX1P2遇上丰田PC10G:EIP实例ID通信的实战解析 在工业自动化领域,不同品牌设备间的通信集成往往充满挑战。最近一次非标设备联调项目中,我们遇到了欧姆龙NX1P2控制器与丰田PC10G设备通过EtherNet/IP(EIP)协议通…...
实测2公里矿用电缆跑网络:用电力载波模块替代光纤,在井下到底靠不靠谱?
井下网络传输技术突围:电力载波在恶劣环境中的实战评估 矿场深处,昏暗潮湿的巷道里,一组工程师正为数据传输问题焦头烂额。传统光纤在煤尘弥漫的环境中频频失效,而工期又迫在眉睫。这时,有人提出了一个大胆的方案——利…...
OliveTin高级功能指南:定时任务、文件监控和实体动态更新
OliveTin高级功能指南:定时任务、文件监控和实体动态更新 【免费下载链接】OliveTin OliveTin gives safe and simple access to predefined shell commands from a web interface. 项目地址: https://gitcode.com/gh_mirrors/ol/OliveTin OliveTin是一个强…...
GeoSeg终极指南:基于Transformer的遥感图像语义分割实战教程
GeoSeg终极指南:基于Transformer的遥感图像语义分割实战教程 【免费下载链接】GeoSeg UNetFormer: A UNet-like transformer for efficient semantic segmentation of remote sensing urban scene imagery, ISPRS. Also, including other vision transformers and C…...
