题目:
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given [3, 30, 34, 5, 9]
, the largest formed number is 9534330
.
Note: The result may be very large, so you need to return a string instead of an integer.
题意:
给定一个数组,其中数组中有很多不同位数的数,那么将这些数字组合到一起(PS:数字内部不能分拆),然后求组合后最大的一个数,注意,组合之后的数字,有可能很大,那么最后输出的结果采用String来表示。和大数表示方式类似。
题解:
此题的关键是确定每个数在最后结果中的先后位置,比较直观的是个位数越大的越靠前,如果个位数相同的,那么就比较十位数,一次类推。可以采用两两合并的方法来做,先将数组中的数字转化为String类型,然后可以将3和34先合并为334,然后交换,看343;那么发现343比334要大,所以34要排在3的前面,故可以利用这条规则来将数组中的所有数字进行排列,得到一个新的结果。这里需要实现一个接口,就是Compartor接口,通过重写这个接口中的compare方法,我们可以按照大小来比较。
public class Solution
{
public String largestNumber(int[] num)
{
int n = num.length;
if (n < 1) return ""; //空的情况
//把数组转化为字符串数组
String[] strs = new String[n];
for (int i = 0; i < n; i++)
{
strs[i] = String.valueOf(num[i]); //将字符串转化成数字
}
//按照数字在结果中的位置排序
Arrays.sort(strs, new Cmp()); //调用Arrays的sort方法,然后按照接口中重写的compare方法来重排列数组中的数字
//把所有字符串拼接在一起
String ans = "";
for (int i = n - 1; i >= 0; i--)
{
ans = ans.concat(strs[i]);
}
//去掉数字开头的0,如输入[0, 0]
int i = 0;
while (i < n && ans.charAt(i) == '0')
{
i++;
}
if (i == n)
return "0";
return ans.substring(i);
}
}
//比较方法很简单:如果[a在前b在后]组成的结果大于[b在前a在后]组成的结果,那么a>b。
class Cmp implements Comparator<String>
{
public int compare(String a,String b) //重写这个方法的时候,我采用了新的比较方法,这种方法是按照从小到大来排列的
{
// TODO Auto-generated method stub
String ab = a.concat(b);
String ba = b.concat(a);
int i = 0;
boolean isTrue = false;
while(i < ab.length())
{
if((int)(ab.charAt(i)) < (int)(ba.charAt(i)))
{
isTrue = true;
break;
}
else if((int)(ab.charAt(i)) > (int)(ba.charAt(i)))
{
break;
}
else
i++;
}
if(i != ab.length() && isTrue == true)
return -1;
else if(i != ab.length() && isTrue == false)
return 1;
else
return 0;
}
}