首页 > 编程语言 >面试题45(Java)-把数组排成最小的数(中等)

面试题45(Java)-把数组排成最小的数(中等)

时间:2023-04-02 14:49:11浏览次数:48  
标签:面试题 right Java String nums strs 45 int 排序

题目:

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:

输入: [10,2]

输出: "102"

示例 2:

输入: [3,30,34,5,9]

输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

 详情解释:可以看 K神老师以及评论区的题解

图片来源于 @K神老师

 思路:

①首先将数组转换成字符串列表;

②基于快速排序的排序规则,对字符列表进行排序;

③拼接排序后的字符串,返回结果即可。

 推荐看一下:博主codereasy的视频,看他的动画讲解的很清楚,然后再看代码就很好理解啦!

代码:

 1 class Solution {
 2     public String minNumber(int[] nums) {
 3        //将数组转换成字符串列表
 4        String[] strs = new String[nums.length];
 5        for(int i = 0; i < nums.length; i++){
 6            strs[i] = String.valueOf(nums[i]);
 7        }
 8        //将字符串列表进行快速排序
 9        quickSort(strs, 0, strs.length-1);
10        //将排序好的结果进行拼接并输出
11        StringBuffer sb = new StringBuffer();
12        for (String s: strs){
13            sb.append(s);
14        }
15        return sb.toString();
16     }
17        //定义快速排序方法
18     public void quickSort(String[] strs, int start, int end){
19         if (start < end){
20             //一轮排序后获取的中间位置
21             int middle = getMiddle(strs, start, end);
22             //这时候基准位置的左边都比它小,右边都比它大
23             //快排基准位置左边部分
24             quickSort(strs, start, middle - 1);
25             //快排基准位置右边的部分
26             quickSort(strs, middle + 1, end);
27         }
28     }
29     public int getMiddle(String[] strs, int left, int right){
30         //设置基准位置为第一个元素
31         String pivot = strs[left];
32         while(left < right){
33             //从右往左看
34             //小于等于0,代表式子中前面小于等于后面的,于是不交换
35             while(left < right && (pivot + strs[right]).compareTo(strs[right] + pivot) <= 0){
36                 right--;
37             }
38             //上面循环不满足,代表需要移动后面的元素到前面
39             strs[left] = strs[right];
40             //从左往右看
41             while(left < right && (strs[left] + pivot).compareTo(pivot + strs[left]) <= 0){
42                 left++;
43             }
44             //上面循环不满足,代表需要移动前面的元素到后面
45             strs[right] = strs[left];
46         }
47         //left = right,中间位置
48         //把基准元素放在这时的中间
49         strs[left] = pivot;
50         return left;
51     }
52 }

小知识:

compareTo:

str1.compareTo(str2):如果str1 < str2,就会返回负数,大于就会返回正数,等于返回0。

标签:面试题,right,Java,String,nums,strs,45,int,排序
From: https://www.cnblogs.com/liu-myu/p/17280056.html

相关文章

  • Java基础语法
    用户交互Scanner实验importjava.util.Scanner;publicclassDome01{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.println("使用Next方式接受");if(scanner.hasNext()){......
  • java——spring boot集成kafka——spring boot集成kafka
    引入依赖:  <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency>          编写配置文件:    erver:port:8080spring:kafka:bootstrap-se......
  • Java IO面试题
    JavaIO概览JavaIO流的40多个类都是从如下4个抽象类基类中派生出来的。InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流。OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。InputStream字节输入流InputStream用于......
  • Java:分数运算(类与对象)
    题目内容:设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。这个类的构造函数是:Fraction(inta,intb)    构造一个a/b的分数。这个类要提供以下的功能:doubletoDouble();    将分数转换为doubleFractionplus(Fractionr);    将自己的分......
  • day14| 94.二叉树的中序遍历;144.二叉树的前序遍历;145.二叉树的后序遍历
    94.二叉树的中序遍历 思路:1.找出重复的子问题这个重复的子问题是:先遍历左子树、再取根节点、最后遍历右子树2.确定终止条件当节点为空是,返回 代码如下:#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,......
  • java面向对象编程-对象的创建分析
    对象的创建分析类与对象的关系类是一种抽象的数据类型,他是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物动物,植物,手机,电脑Person类,Pet类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为对象是抽象概念的具体事例张三就是人的一个具......
  • 453.最小操作次数使数组元素相等
    最小操作次数使数组元素相等给你一个长度为n的整数数组,每次操作将会使n-1个元素增加1。返回让数组所有元素相等的最小操作次数。示例1:输入:nums=[1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3]=>[2,3,3]=>[3,4,3]=>[4,4,4]......
  • JavaIO流:主要知识点
    JavaIO流:主要知识点File类介绍:java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。File能新建、删除、重命名文件和目录,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。想要在Java程序中表示一个真实存在的文件或目录,那么必......
  • java面向对象编程
    面向对象编程java的核心思想就是OOP面向过程&面向对象面向过程:步骤清晰简单,第一步做什么,第二步做什么···适合处理较为简单的问题面向对象:物理类聚,分类的思维模式,思考问题首先解决问题需要哪些分类,然后对这些分类进行单独思考,最后对某个分类下的细节进行面向过......
  • kafka(java客户端)生产者消费者不能连接虚拟机kafka
    报错如下:...:localhost:9092...java.net.ConnectException:Connectionrefused:nofurtherinformationatsun.nio.ch.SocketChannelImpl.checkConnect(NativeMethod)atsun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739)atorg.apac......