一、题目描述
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
二、代码思路
整体思路:本质上属于自定义排序比较规则,然后按照规则进行排序,最终组成结果值。
根据整体的思路,有三种方法定义排序规则。
- 设字符串 A 与 B,比较C1=A+B转成整形与C2=B+A转成整形两者谁大从而判断A与B的顺序。缺点就是整形会越界。
(0 <= nums[i] <= 109) - 与第一个思路类似,但是这次不需要转整形,而是遍历C1与C2字符串来逐个字符判断大小。
- 与2类似也是两个字符串比较,2是最简单的比较。
三、代码题解
public String largestNumber(int[] nums) {
//考虑一种边界值,就是所有元素都是0
String strs[] = new String[nums.length];
int flag = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
flag = 1;
}
strs[i] = nums[i] + "";
}
if (flag == 0) {
return "0";
}
Arrays.sort(strs, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (compareStrs(o1, o2)) {
return 1;
} else {
return -1;
}
}
});
//quickSort(nums, 0, nums.length - 1);
StringBuffer stringBuffer = new StringBuffer();
for (int i = strs.length - 1; i >= 0; i--) {
stringBuffer.append(strs[i]);
}
return new String(stringBuffer);
}
//比较两个字符串谁比较大,但是会出现整形越界的情况
public boolean compareStrs1(String str1, String str2) {
int num1 = Integer.parseInt(str1 + str2);
int num2 = Integer.parseInt(str2 + str1);
return num1 >= num2 ? true : false;
}
//比较两个字符串谁比较大
public boolean compareStrs(String str1, String str2) {
String num1 = str1 + str2;
String num2 = str2 + str1;
int length = num1.length();
for (int i = 0; i < length; i++) {
if (num1.charAt(i) > num2.charAt(i)) {
return true;
} else if (num1.charAt(i) < num2.charAt(i)) {
return false;
} else {
continue;
}
}
return true;
}
时间复杂度:O(n^2logn)
空间复杂度:O(n)