剑指 Offer 45. 把数组排成最小的数
示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
思路
题意:根据跟定数字通过排序组合得到最小数字。
方法:将整数数组转换为字符串数组,重写排序。比较字符串str[i]和str[j]一前一后连接组成的新字符串s1(先i后j)和s2(先j后i)。(可以逐位字符比较,也可以转为Double比较,但转换比较耗时)
代码
class Solution {
public void Merge(String[] str, int start, int mid, int end) {
String[] tmp = new String[str.length];
for (int i = start; i <= end; i++)
tmp[i] = str[i];
int i = start;
int j = mid + 1;
int k = start;
while (i <= mid && j <= end) {
String s1 = tmp[i] + tmp[j];
String s2 = tmp[j] + tmp[i];
int ii = 0;
if (s1.equals(s2))
str[k++] = tmp[i++];
else {
while (ii < s1.length()) {
if (s1.charAt(ii) < s2.charAt(ii)) {
str[k++] = tmp[i++];
break;
}
else if (s1.charAt(ii) > s2.charAt(ii)) {
str[k++] = tmp[j++];
break;
}
ii++;
}
}
}
while (i <= mid)
str[k++] = tmp[i++];
while (j <= end)
str[k++] = tmp[j++];
}
public void MergeSort(String[] str, int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
MergeSort(str, start, mid);
MergeSort(str, mid+1, end);
Merge(str, start, mid, end);
}
}
public String minNumber(int[] nums) {
String result = "";
String[] str = new String[nums.length];
for (int i = 0; i < nums.length; i++)
str[i] = String.valueOf(nums[i]);
MergeSort(str, 0, str.length - 1);
for (String s: str)
result += s;
return result;
}
}