1. 题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/077a9c6d27f941f08ae934e110e7cac9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Zi_6LSi57un57ut5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. 思路
(1) 快速排序
- 要想让所有数字连起来的数最小,就要使任意两个数连起来的数最小。
- 如3和30,当3在左、30在右时,连起来的数为330,当30在左、3在右时,连起来的数为303,显然303更小,因此无论3和30在什么位置,30必须在相对于3的左边。
- 根据上面的规则,重新定义两个数之间">=“和”<="的关系,并对数组进行快速排序,最后将数组按顺序连接成字符串返回即可。
3. 代码
public class Test {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.minNumber(new int[]{3, 30, 34, 5, 9}));
}
}
class Solution {
public String minNumber(int[] nums) {
String[] str = new String[nums.length];
for (int i = 0; i < nums.length; i++) {
str[i] = String.valueOf(nums[i]);
}
sort(str, 0, str.length - 1);
StringBuilder res = new StringBuilder();
for (String s : str) {
res.append(s);
}
return res.toString();
}
private void sort(String[] str, int left, int right) {
if (left >= right) {
return;
}
int low = left;
int high = right;
String pivot = str[low];
while (low < high) {
while (low < high && (str[high] + pivot).compareTo(pivot + str[high]) >= 0) {
high--;
}
str[low] = str[high];
while (low < high && (str[low] + pivot).compareTo(pivot + str[low]) <= 0) {
low++;
}
str[high] = str[low];
}
str[low] = pivot;
sort(str, left, low - 1);
sort(str, low + 1, right);
}
}