问题描述
给定一组非负整数 nums,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:"210"
示例 2:
输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:
输入:nums = [1]
输出:"1"
示例 4:
输入:nums = [10]
输出:"10"
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 109
解题思路:
此题求拼接起来的最大数字,本质上是一个排序问题。设数组 nums中任意两数字的字符串为x 和y ,
则规定排序判断规则为:
若拼接字符串x+y>y+x,则x大于y,我们可以把x放在前面
否则,y大于x,我们可以把x放在后面。
一旦数组排好了序,最“重要/大”的数字会在最前面。
有一个需要注意的情况是如果数组只包含 0 ,我们直接返回结果 0 即可。
否则,我们用排好序的数组形成一个字符串并返回。
实现代码
class Solution {
public String largestNumber(int[] nums) {
int n=nums.length;
/*
因为Java提供的比较器的参数必须是对象类型,所以这里需要把nums数组中的元素值
都复制Integer中
*/
Integer onums[]=new Integer[n];
for(int i=0;i<n;i++){
onums[i]=nums[i];
}
/*
此题求拼接起来的最大数字,本质上是一个排序问题。设数组 nums中任意两数字的字符串为x 和y ,
则规定排序判断规则为:
若拼接字符串x+y>y+x,则x大于y,我们可以把x放在前面
否则,y大于x,我们可以把x放在后面。
一旦数组排好了序,最“重要/大”的数字会在最前面。
*/
Arrays.sort(onums,new Comparator<Integer>(){
public int compare(Integer x,Integer y){
String sx=String.valueOf(x); //将数值转换为字符串
String sy=String.valueOf(y);
String xy=sx+sy;
String yx=sy+sx;
int n=xy.length();
//比较xy和yx的大小,从高位逐位进行比较。如果都一样大,返回0。如果xy大,返回-1,否则返回1
for(int i=0;i<n;i++){
int a=xy.charAt(i)-'0';
int b=yx.charAt(i)-'0';
if(a>b){
return -1;
}else if(a<b){
return 1;
}else{
continue;
}
}
return 0;
}
});
int j;
/*
有一个需要注意的情况是如果数组只包含 0 ,我们直接返回结果 0 即可。
否则,我们用排好序的数组形成一个字符串并返回。
*/
for(j=0;j<n;j++){
if(onums[j]!=0){
break;
}
}
if(j==n){
return "0";
}
//使用stringbuffer能提高效率
StringBuffer sb=new StringBuffer();
//从前往后添加最“大”的数
for(int i=0;i<n;i++){
sb.append(String.valueOf(onums[i]));
}
//返回值是String类型
return sb.toString();
}
}