把数组排成最小的数

问题陈述

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

示例:

1
2
输入: [3,30,34,5,9]
输出: "3033459"

说明:

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

思路分析

将数字转化为字符串进行比较。如“3”,“30”比较方法:错位组合比较,330和303,得303更小。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public String minNumber(int[] nums) {
if(nums==null||nums.length==0) return ""; //判断数组是否为空
int n=nums.length;
String[] minArray=new String[n]; //定义一个字符串数组放入整数元素并用空格隔开。
for(int i=0;i<n;i++){
minArray[i]=nums[i]+"";
}
Arrays.sort(minArray,(s1,s2)->(s1+s2).compareTo(s2+s1));//字符串数组排序。使用lamda表达式作为内部函数进行比较。
String output="";
for(String str:minArray) //输出数组排成的最小数字符串
output+=str;
return output;
}
}

Java空字符串与null区别:

1、类型
null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = “” ;

2、内存分配
String str = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
String str = “”; 表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间;

Arrays.sort(minArray,(s1,s2)->(s1+s2).compareTo(s2+s1))解析:
对minArray进行排序,排序方法为对其中的元素s1、s2使用比较方法:s1+s2与s2+s1连接后数值大小比较