179.最大数
# 179.最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
输入:nums = [3,30,34,5,9] 输出:"9534330"
- 这道题有点像基数排序,都是根据每个数每一位上进行比较判断。两个数字最高位不同时更大的排在前面,相同时则分别比较次高位。当两个数字的长度不同并且某一个数比较到最末位时,此时需要把另一个数接到该数的末尾继续进行位上数字的比较,举个例子[432,43243],比较到末尾时应该自动补足成43243243和43243432进行比较。注意仅当初始元素的长度不相等且比较到末位才能够用补足的方法,对于完全相等的两个数不能补足。因为比较时需要任意访问每一位上的数,可以先把int类型元素转化成StringBuilder类型再进行比较。
public String largestNumber(int[] nums) {
StringBuilder res=new StringBuilder();
int p=0,max=0;
boolean zero=true;
for(int i=0;i<nums.length;i++)
if(nums[i]!=0) zero=false;
if(zero==true) return res.append("0").toString();
StringBuilder a=new StringBuilder(),b=new StringBuilder();
while(p<nums.length)
{
for(int i=1;i<nums.length;i++)
if(nums[i]!=-1&&i!=max)
{
a.append(String.valueOf(nums[max]));
b.append(String.valueOf(nums[i]));
int k=0;
while(true)
{
if(k==a.length()&&k==b.length()) break;
if(k==a.length()) a.append(String.valueOf(nums[i]));
if(k==b.length()) b.append(String.valueOf(nums[max]));
if(a.charAt(k)==b.charAt(k))
{
k++;
continue;
}
if(a.charAt(k)<b.charAt(k)) max=i;
break;
}
a.delete(0,a.length());
b.delete(0,b.length());
}
res.append(String.valueOf(nums[max]));
nums[max]=-1;
for(max=0;max<nums.length&&nums[max]==-1;max++);//找到一个未加入的元素下标
p++;
}
return res.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57