华为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,一经查实,立即删除!

相关文章

Elasticsearch容器启动报错:AccessDeniedException[/usr/share/elasticsearch/data/nodes];

AccessDeniedException 表明 Elasticsearch 容器无法访问或写入数据目录 /usr/share/elasticsearch/data/nodes。这是一个权限问题。 问题原因&#xff1a; 1、宿主机目录权限不足&#xff1a;映射到容器的数据目录 /data/es/data 在宿主机上可能没有足够的权限供容器访问。 …

设计模式-结构型-装饰器模式

装饰器模式&#xff08;Decorator Pattern&#xff09;是结构型设计模式中的一种&#xff0c;它允许你通过将对象封装在一个新的对象中&#xff0c;来动态地添加新的功能&#xff0c;而无需改变原对象的结构。装饰器模式的核心思想是“将功能附加到对象上”&#xff0c;它是一种…

第8篇:从入门到精通:掌握Python异常处理

第8篇&#xff1a;异常处理 内容简介 本篇文章将深入探讨Python中的异常处理机制。您将学习异常的基本概念与类型&#xff0c;掌握使用try-except块处理异常的方法&#xff0c;了解finally语句的作用&#xff0c;以及如何抛出和定义自定义异常。通过丰富的代码示例&#xff0…

Ubuntu20.4和docker终端指令、安装Go环境、安装搜狗输入法、安装WPS2019:保姆级图文详解

目录 前言1、docker、node、curl版本查看终端命令1.1、查看docker版本1.2、查看node.js版本1.3、查看curl版本1.4、Ubuntu安装curl1.5、Ubuntu终端保存命令 2、安装docker-compose、Go语言2.1、安装docker-compose2.2、go语言安装步骤2.3、git版本查看 3、Ubuntu20.4安装搜狗输…

【PHP】双方接口通信校验服务

请求方 使用 ApiAuthService::buildUrl($domain, [terminal > 1, ts > time()]); //http://域名/adminapi/login/platformLogin?signF7FE8A150DEC18BE8A71C5059742C81A&terminal1&ts1736904841接收方 $getParams $this->request->get();$validate ApiA…

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

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

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

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

从零开始,掌握Django Web开发

1. Django简介 Django是一个强大的Python Web框架,它使开发人员能够快速构建安全、可扩展的Web应用程序。让我们深入了解Django的特性和优势。 1.1 什么是Django? Django是一个高级Python Web框架,于2005年首次发布。它由新闻网站的开发人员创建,旨在处理快节奏的新闻编辑室…

解决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;和根…

esg信息披露是什么,有什么意义

ESG信息披露是指企业将其在运营中涉及的环境&#xff08;Environment&#xff09;、社会&#xff08;Social&#xff09;及治理&#xff08;Governance&#xff09;因素&#xff0c;向投资者、消费者等利益相关者公开揭示的过程。以下是对ESG信息披露及其意义的详细解释&#x…

Power Automate 实现字符串分割、替换、换行显示

在 Power Automate 中&#xff0c;有时从 Forms 过来的数据是多选列表&#xff0c;导致选项内容是 ["AAAA","BBBB"] 这样的格式&#xff08;注意是字符串而不是列表&#xff09;&#xff0c;往往需要转换为换行显示的形式易于阅读&#xff1a; 方法 使用表…

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

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

无人机(Unmanned Aerial Vehicle, UAV)路径规划介绍

无人机&#xff08;Unmanned Aerial Vehicle, UAV&#xff09;是无人驾驶飞行器的简称。凭借其体积小巧、操作简便、生存能力强等诸多优势&#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;是一家以科技驱动的全球酒店资源批发商…