题目描述
思路
以[3,30,34,5,9]输出"9534330"为例,
- 把nums转为string类型的数组arr,然后对它进行降序排序
- 如果直接用Arrays.sort(),得到的结果是9,5,34,30,3,输出9534303,但是应该得到9534330
- 所以,30和3,3应该更靠前 排序规则:
- "30"和"9","309" < "930", 所以9“更大”;"30"和"3","303" < "330",所以3“更大”
- 这里说的“更大”是指在拼接结果时,应该更靠前。比如99、30、3拼出来的最大数应该是99330,而不是99303
- 上面的比较大小直接使用string的compare,因为这样可以快速拼接两个数字字符串然后比较
注意点:
str = String.valueOf(int)把数字转为字符串str1.compareTo(str2)- 如果str1对应的数字大于str2,返回1
- 如果str1对应的数字小于str2,返回**-1**,相等返回0
代码
class Solution {
public String largestNumber(int[] nums) {
//nums转为string数组
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = nums[i] + "";
}
Arrays.sort(strs, (a, b) -> {
String s1 = a + b; // 3 30
String s2 = b + a; // 30 3
return s1.compareTo(s2); // 从小到大排
});
//特殊处理:输入[0,0] 输出应该为“0”,否则输出“00”
if (strs[strs.length - 1].equals("0")) {
return "0";
}
// 按照排序拼接结果
String res = "";
for (int i = strs.length - 1; i >= 0; i--) {
res += strs[i];
}
return res;
}
}
class Solution {
public String largestNumber(int[] nums) {
//nums转为string数组
String[] strs = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
strs[i] = nums[i] + "";
}
sort(strs, 0, nums.length - 1);
//特殊处理:输入[0,0] 输出应该为“0”,否则输出“00”
if (strs[strs.length - 1].equals("0")) {
return "0";
}
// 按照排序拼接结果
String res = "";
for (int i = strs.length - 1; i >= 0; i--) {
res += strs[i];
}
return res;
}
public void sort(String[] strs, int start, int end) {
int i = start, j = end, pivot = start;
if (start > end) {
return;
}
while (i != j) {
// strs[j]比strs[pivot]更大, 3 > 30
while ((strs[j] + strs[pivot]).compareTo(strs[pivot] + strs[j]) > 0) {// >=0 wrong!
j--;
}
// strs[j]比strs[pivot]更小 30 < 3
while (i != j && ((strs[i] + strs[pivot])).compareTo((strs[pivot] + strs[i])) <= 0) {
i++;
}
swap(strs, i, j);
}
swap(strs, i, pivot);
sort(strs, start, i - 1);
sort(strs, i + 1, end);
}
public void swap(String[] strs, int m, int n) {
String tmp = strs[m];
strs[m] = strs[n];
strs[n] = tmp;
}
}