算法的学习笔记—把数组排成最小的数(牛客JZ45)

ops/2024/9/23 0:13:22/

img

😀前言
在编程面试中,经常会遇到需要将问题转化为排序问题的题目。这些问题看似复杂,但只要抓住核心思路,便能迅速解决。今天我们就来看一道这样的题目:如何将一个非负整数数组拼接成最小的数字

🏠个人主页:尘觉主页

文章目录

  • 🥰把数组排成最小的数
    • 题目链接
    • 🤔题目描述
      • 示例输入输出
    • 🥰解题思路
    • 💖实现代码
      • 代码详解
      • 复杂度分析
    • 😄总结

🥰把数组排成最小的数

题目链接

牛客

🤔题目描述

给定一个非负整数数组 numbers,要求将数组里的所有数字拼接起来,形成一个新的数字,并返回其中最小的那个。例如:

  • 输入数组 [3, 32, 321],我们可以将这些数字拼接成 321323,这个数字是所有可能拼接结果中的最小值。
  1. 输出结果可能非常大,所以你需要返回一个字符串而不是整数

  2. 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

数据范围:

0<=len(numbers)<=100

示例输入输出

  • 输入:[11, 3]
    • 返回值:"113"
  • 输入:[]
    • 返回值:""(空字符串)
  • 输入:[3, 32, 321]
    • 返回值:"321323"

🥰解题思路

解决这个问题的关键在于如何定义两个数字在拼接时的优先级。直观地,我们需要比较两个数字 S1S2 在不同顺序下拼接的结果。

例如,对于两个数字 332

  • 如果 S1 = "3"S2 = "32",那么 S1+S2"332"S2+S1"323"。显然,"323" 更小,因此我们应该将 32 排在 3 前面。

通过这种比较方式,我们可以定义一个自定义的排序规则,接着使用 Java 中的 Arrays.sort 方法进行排序,最终得到最小的拼接结果。

💖实现代码

以下是用 Java 实现的代码:

java">import java.util.Arrays;public class MinNumber {public String PrintMinNumber(int[] numbers) {// 判断输入是否为空或长度为0,如果是则返回空字符串if (numbers == null || numbers.length == 0)return "";int n = numbers.length;// 创建一个字符串数组,用于存储每个数字的字符串形式String[] nums = new String[n];for (int i = 0; i < n; i++) {// 将数字转换为字符串并存储到字符串数组中nums[i] = String.valueOf(numbers[i]);}// 使用自定义的排序规则对字符串数组进行排序// 排序规则:如果拼接结果 s1+s2 小于 s2+s1,则 s1 排在前面Arrays.sort(nums, (s1, s2) -> (s1 + s2).compareTo(s2 + s1));// 使用 StringBuilder 来拼接排序后的字符串数组StringBuilder ret = new StringBuilder();for (String str : nums) {ret.append(str);}// 返回拼接后的字符串结果// 注意:此处不需要去除可能存在的前导0,因为题目没有要求去除return ret.toString();}
}

代码详解

  1. 字符串数组初始化:首先,我们将整数数组 numbers 转换为字符串数组 nums,这是因为在后续操作中,我们需要比较字符串拼接的结果。
  2. 自定义排序规则:接着,我们利用 Arrays.sort 方法对字符串数组进行排序。排序时,比较的关键是拼接后的字符串 s1+s2s2+s1 的大小。如果 s1+s2 小于 s2+s1,那么 s1 应该排在 s2 前面。
  3. 拼接结果:排序完成后,将排序好的字符串数组拼接成一个字符串,并返回这个最终结果。

复杂度分析

  • 时间复杂度:排序算法的时间复杂度为 O(n log n),其中 n 是数组的长度。由于每次比较涉及字符串的拼接操作,因此整体的时间复杂度还会受到字符串长度的影响。
  • 空间复杂度:主要空间消耗在字符串数组 nums 上,空间复杂度为 O(n)

😄总结

通过这道题目,我们看到了如何将一个复杂的拼接问题转化为排序问题,并且掌握了一种自定义排序规则的方法。这种思想不仅仅适用于本题,很多涉及组合或排列的问题都可以通过类似的思路来解决。

这道题目在许多面试中都会出现,它不仅考察了候选人的编程能力,更测试了对排序算法的理解与应用能力。希望通过本文的讲解,你能够掌握这一重要的编程技巧,并在实际开发中灵活运用。

😁热门专栏推荐
学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img


http://www.ppmy.cn/ops/105028.html

相关文章

RTC(实时时钟)/BKP(备份寄存器

1 unix时间戳 2 时间戳转换函数 3 BKP&#xff08;备份寄存器&#xff09; 1 TAMPER引脚侵入事件 2 RTC校准时间 3 RST闹钟脉冲和秒脉冲 可以输出出来为其他信号提供 4 校准时钟&#xff0c;寄存器加输出RTC校准时钟 5 总结&#xff1a;3个功能只能同时使用一个 4 BKP基本…

将python项目打包成一个可执行文件(包含需要的资源文件)

目标 项目源码是采用Python编写&#xff0c;代码中需要读取部分资源文件。现在需要将项目打包成一个exe文件&#xff0c;没有其他任何多余文件&#xff0c;仅1个exe文件。 打包 安装pyinstaller 在自己项目的虚拟环境中&#xff0c;安装pyinstaller。注意一定要是虚拟环境&…

每天一个数据分析题(五百一十五)- 朴素贝叶斯分类器

朴素贝叶斯分类器是一系列以假设特征之间强&#xff08;朴素&#xff09;独立下运用贝叶斯定理为基础的简单概率分类器。该分类器模型会给问题实例分配用特征值表示的类标签&#xff0c;类标签取自有限集合。下列选项不属于朴素贝叶斯分类器特点的是&#xff1f; A. 面对孤立的…

3.2 Browser -- useColorMode

3.2 Browser – useColorMode https://vueuse.org/core/useColorMode/ 作用 可以自动持久化的响应式颜色主题模式。 官方示例 import { useColorMode } from vueuse/coreconst mode useColorMode() // Ref<dark | light>默认情况下&#xff0c;它将使用usePreferre…

Spel注入漏洞分析

文章目录 SPEL注入SPEL漏洞案例CVE-2022-2297EXP SPEL注入 SPEL是Spring框架中的一种表达式语言&#xff0c;用于在Spring配置中动态计算值。它提供了一种简洁的语法&#xff0c;用于访问和操作对象的属性、调用方法、进行数学计算、逻辑运算等。允许开发者在Spring应用程序中…

Java基于微信小程序的超市购物管理系统

1 简介 Java基于微信小程序的超市购物管理系统&#xff0c;此超市购物系统利用当下成熟完善的springboot框架&#xff0c;使用跨平台的可开发大型商业网站的Java语言&#xff0c;以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了收货地址管理、购物车管理、…

JVM(Java虚拟机)

Java的“一次编写&#xff0c;处处运行”主要得益于Java的设计理念和Java虚拟机&#xff08;JVM&#xff09;的存在。 JVM&#xff08;Java Virtual Machine&#xff09;是Java虚拟机的简称&#xff0c;它是运行所有Java程序的抽象计算机。也就是说&#xff0c;JVM是一个能够运…

世界复合医学杂志社世界复合医学编辑部2024年第4期目录

论著 苏子降气汤联合三子养亲汤治疗痰浊壅肺型慢性阻塞性肺疾病急性加重期的临床疗效 周芹;周磊; 1-437 天麻钩藤汤加减联合依那普利叶酸片对原发性高血压患者血压水平与中医证候积分的影响 邹文博;王世雄; 5-8 伏诺拉生联合康复新液治疗反流性食管炎的临床研究 孙…