推荐
完整《剑指Offer》算法题解析系列请点击 👉 《剑指Offer》全解析 Java 版
题目描述
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
import java.util.ArrayList;
public class Solution {
public String PrintMinNumber(int [] numbers) {
}
}
思路:
自定义一个比较大小的函数,比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。
实现:
public class TestBlock {
public String PrintMinNumber(int [] numbers) {
String s = "";
ArrayList<Integer> list = new ArrayList<Integer>();
//将数组中的数字添加到集合中
for (int num : numbers) {
list.add(num);
}
//自定义比较器,并将集合中的值用这个比较强排序,自定义比较器可以用 lambda表达式写。
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer str1, Integer str2) {
String s1 = str1 + "" + str2;
String s2 = str2 + "" + str1;
return s1.compareTo(s2);
}
});
//将排完序的数组遍历拼接起来
for (int j : list) {
s += j;
}
return s;
}
}
附录:
关于比较器的升序和降序问题
//关于比较器的升序和降序
Collections.sort(list, new Comparator<String>() {
public int compare(String str1, String str2) {
/** * 升序排的话就是: 第一个参数.compareTo(第二个参数); * 降序排的话就是: 第二个参数.compareTo(第一个参数); */
// 升序
// return str1.compareTo(str2);
// 降序
return str2.compareTo(str1);
}
看完之后,如果还有什么不懂的,可以在评论区留言,会及时回答更新。
这里是猿兄,为你分享程序员的世界。
非常感谢各位大佬们能看到这里,如果觉得文章还不错的话, 求点赞👍 求关注💗 求分享👬求评论📝 这些对猿兄来说真的 非常有用!!!
注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!