华为OD机试E卷 ---最大值

一、题目描述

给定一组整数(非负),重排顺序后输出一个最大的整数。

二、示例1

用例1

输入

10 9

输出

910

说明:输出结果可能非常大,所以你需要返回一个 字符串只而不是整数。

三、输入描述

数字组合

四、输出描述

最大的整数

五、解题思路

  1. 字符串转换

    • 首先,将整数数组中的每个元素转换为字符串,以便进行字符串比较和拼接。
  2. 自定义排序

    • 使用自定义的比较器对字符串数组进行排序。比较规则是:对于任意两个字符串ab,比较a + bb + a的大小。
    • 如果a + b大于b + a,则a应该排在b前面,以形成更大的数字。
    • 反之,如果a + b小于b + a,则b应该排在a前面。
    • 如果两者相等,则保持相对顺序不变(或者可以根据具体实现选择任意一种顺序,因为不影响最终结果)。
  3. 处理特殊情况

    • 排序后,如果数组的第一个元素是"0",则需要检查数组中是否全部为"0"。
    • 如果全部为"0",则直接返回"0"。
    • 如果不是全部为"0",但由于某些数字(如0)的存在,在排序后可能导致结果不是以最大数字开头(尽管这种情况在题目给定的非负整数范围内不太可能,但作为一种健壮性考虑),仍然需要按照排序后的结果拼接。
    • 实际上,在题目给定的非负整数范围内,只要正确实现了自定义排序,就不会出现以非最大数字开头的情况。
  4. 拼接结果

    • 将排序后的字符串数组使用StringBuilder或简单的字符串拼接操作合并成一个结果字符串。
  5. 返回结果

    • 返回拼接后的结果字符串作为最终输出。

六、代码实现(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
}
解析步骤
  1. 初始化数组:

    • 输入数组nums{10, 9}
  2. 转换为字符串数组:

    • 方法内部,首先将整数数组转换为字符串数组numStrs,得到{"10", "9"}
  3. 自定义排序:

    • 使用Arrays.sort方法和自定义的Comparator对字符串数组进行排序。
    • 比较规则是:将两个字符串ab分别进行拼接,形成a + bb + a,然后比较这两个拼接字符串的大小。
    • 在本例中,比较"10" + "9""9" + "10",即"109""910"
    • 由于"910"大于"109",因此自定义比较器会判定"9"应该排在"10"前面。
    • 排序后,numStrs变为{"9", "10"}(但实际上,由于我们的比较规则是降序排列以形成最大数,排序后的结果应该直接满足这个顺序,这里的描述是为了说明比较过程)。
  4. 处理特殊情况:

    • 检查排序后的数组的第一个元素是否为"0"。如果是,且数组中只包含零(虽然在这个特定例子中不是这种情况),则直接返回"0"
    • 在本例中,numStrs[0]"9",不是"0",因此不需要特殊处理。
  5. 拼接结果字符串:

    • 使用StringBuilder将排序后的字符串数组拼接成一个结果字符串。
    • 在本例中,拼接后的结果是"910"
  6. 返回结果:

    • 方法返回拼接后的结果字符串"910"
  7. 打印输出:

    • main方法中,打印调用largestNumber(nums)的返回值,输出为"910"

九、注意事项

  • 在自定义排序中,比较器返回的是order2.compareTo(order1),这是因为我们想要实现的是降序排列以形成最大数。如果order2大于order1,则compare方法应该返回正数,表示b应该排在a前面(但在数组中实际上是a排在b的位置被交换到了后面,因为Arrays.sort默认是升序排序,我们通过返回负数的相反数来实现降序)。
  • 在处理特殊情况时,由于题目要求非负整数,因此如果排序后的第一个元素是"0",则可以直接返回"0",无需进一步检查数组中是否包含其他非零元素(因为如果有其他非零元素,它们会在排序过程中被正确地放在"0"的前面)。但作为一种健壮性考虑,上述代码仍然检查了排序后的第一个元素是否为"0",并相应地返回了结果。在实际应用中,这种检查可能是多余的,具体取决于题目的严格要求和输入数据的范围。

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

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

相关文章

【设计模式】 单例模式(单例模式哪几种实现,如何保证线程安全,反射破坏单例模式)

单例模式 作用&#xff1a;单例模式的核心是保证一个类只有一个实例&#xff0c;并且提供一个访问实例的全局访问点。 实现方式优缺点饿汉式线程安全&#xff0c;调用效率高 &#xff0c;但是不能延迟加载懒汉式线程安全&#xff0c;调用效率不高&#xff0c;能延迟加载双重检…

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用&#xff0c;它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…

解决conda create速度过慢的问题

问题 构建了docker容器 想在容器中创建conda环境&#xff0c;但是conda create的时候速度一直很慢 解决办法 宿主机安装的是anaconda 能正常conda create,容器里安装的是miniforge conda create的时候速度一直很慢&#xff0c;因为容器和宿主机共享网络了&#xff0c;宿主机…

【Hive】新增字段(column)后,旧分区无法更新数据问题

TOC 【一】问题描述 Hive修改数据表结构的需求&#xff0c;比如&#xff1a;增加一个新字段。 如果使用如下语句新增列&#xff0c;可以成功添加列col1。但如果数据表tb已经有旧的分区&#xff08;例如&#xff1a;dt20190101&#xff09;&#xff0c;则该旧分区中的col1将为…

【Python】Selenium根据网页页面长度,模拟向下滚动鼠标,直到网页底部的操作

最近在弄selenium的爬取的过程中&#xff0c;我发现一些网站上的表格&#xff0c;是需要手动拉到底部才能加载完成的。 如果没有拉到底部&#xff0c;那么在获取网页表格的时候&#xff0c;表格就会只有显示的一部分&#xff0c;页面就不完整。 所以我就整理了一些模拟滚动鼠…

openharmony电源管理子系统

电源管理子系统 简介目录使用说明相关仓 简介 电源管理子系统提供如下功能&#xff1a; 重启服务&#xff1a;系统重启和下电。系统电源管理服务&#xff1a;系统电源状态管理和休眠运行锁管理。显示相关的能耗调节&#xff1a;包括根据环境光调节背光亮度&#xff0c;和根…

麒麟操作系统服务架构保姆级教程(十一)https配置

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 在运维工作中&#xff0c;加密和安全的作用是十分重要的&#xff0c;如果仅仅用http协议来对外展示我们的网站&#xff0c;过一段时间就会发现网站首页被人奇奇怪怪的篡改了&#xff0c;本来好好的博…

RabbitMQ---消息确认和持久化

&#xff08;一&#xff09;消息确认 1.概念 生产者发送消息后&#xff0c;到达消费端会有以下情况&#xff1a; 1.消息处理成功 2.消息处理异常 如果RabbitMQ把消息发送给消费者后就把消息删除&#xff0c;那么就可能会导致&#xff0c;消息处理异常想要再获取这条消息的时…

Linux:System V - 共享内存

1.System V共享内存的原理 通过为用户提供系统调用接口&#xff0c;让用户可以申请一块空间&#xff0c;进程A/B也可以通过系统调用接口将创建好的内存通过页表映射进进程的地址空间。完成让不同的两个进程看见同一份资源的目的。如果未来不想继续通信&#xff0c;取消进程和内…

SpringBoot错误码国际化

先看测试效果&#xff1a; 1. 设置中文 2.设置英文 文件结构 1.中文和英文的错误消息配置 package com.ldj.mybatisflex.common;import lombok.Getter;/*** User: ldj* Date: 2025/1/12* Time: 17:50* Description: 异常消息枚举*/ Getter public enum ExceptionEnum {//…

道旅科技借助云消息队列 Kafka 版加速旅游大数据创新发展

作者&#xff1a;寒空、横槊、娜米、公仪 道旅科技&#xff1a;科技驱动&#xff0c;引领全球旅游分销服务 道旅科技 &#xff08;https://www.didatravel.com/home&#xff09; 成立于 2012 年&#xff0c;总部位于中国深圳&#xff0c;是一家以科技驱动的全球酒店资源批发商…

Solidity01 Solidity极简入门

一、Solidity 简介 Solidity 是一种用于编写以太坊虚拟机&#xff08;EVM&#xff09;智能合约的编程语言。我认为掌握 Solidity 是参与链上项目的必备技能&#xff1a;区块链项目大部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以规避很多亏钱项目。 Solidity …

如何使用WPS的JS宏实现Word表格的自动编号

如何使用WPS的JS宏实现Word表格的自动编号&#xff1f;如下图&#xff0c;想要给表格的编号列中添加序号。 使用WPS的JS宏可以实现自动编号&#xff0c;代码如下&#xff1a; n Selection.Tables.Item(1).Rows.Count;for(i 2;i<n;i){Selection.Tables.Item(1).Cell(i,1).…

Python在多个Excel文件中找出缺失数据行数多的文件

本文介绍基于Python语言&#xff0c;针对一个文件夹下大量的Excel表格文件&#xff0c;基于其中每一个文件内、某一列数据的特征&#xff0c;对其加以筛选&#xff0c;并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法。 首先&#xff0c;我们来明确一下本…

【Linux】应用层自定义协议与序列化

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; 应用层 &#x1f98b; 再谈 "协议"&#x1f98b; 网络版计算器&#x1f98b; 序列化 和 反序列化 二&#xff1a;&#x1f525; 重新理解 read、…

数字化贷款管理:助贷系统软件为贷款中介带来的五大改变

随着金融行业的数字化转型&#xff0c;贷款中介的业务模式也在不断创新。助贷系统作为数字化管理的核心工具&#xff0c;正在为贷款中介带来深刻的变革。本文将从五个方面探讨助贷系统软件如何改变贷款中介行业的管理模式&#xff0c;提升业务效率&#xff0c;降低运营成本。乐…

MIAOYUN信创云原生项目亮相西部“中试”生态对接活动

近日&#xff0c;以“构建‘中试’生态&#xff0c;赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节&#xff0c;成都元来云志科技有限…

一文简要了解为什么需要RAG、核心原理与应用场景

欢迎来到AI应用探索&#xff0c;这里专注于探索AI应用。 一、为什么需要RAG&#xff0c;它解决了哪些问题 在自然语言处理领域&#xff0c;生成式预训练模型&#xff08;如GPT&#xff09;已经展示了强大的文本生成能力。然而&#xff0c;这些模型有以下局限性&#xff1a; 知…

gametime

gametime 一、查壳 无壳&#xff0c;32位 二、IDA分析 先看看main 妈呀&#xff0c;好多函数&#xff0c;脑子有点乱 先运行下EXE看看有什么突破口没 可以看出是游戏&#xff0c;明显是看你的输入对不对&#xff0c;来通关的&#xff0c;所以有关判定的条件或者函数是解题…

基于机器学习随机森林算法的个人职业预测研究

1.背景调研 随着信息技术的飞速发展&#xff0c;特别是大数据和云计算技术的广泛应用&#xff0c;各行各业都积累了大量的数据。这些数据中蕴含着丰富的信息和模式&#xff0c;为利用机器学习进行职业预测提供了可能。机器学习算法的不断进步&#xff0c;如深度学习、强化学习等…