本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个字符串数组,里面有很多的元素,我们让他们前后随意拼接,最后拼接结果中最小的那个。
思路
这个题目我们用贪心策略,那我们的贪心策略有哪些呢?
我们可以试试把最小的元素放在前面来拼接,我相信大家的第一想法应该是这个。但是这个是有反例的。
"b","ba"
上面那个数组的正确拼接应该是bab,但是如果按照上面的贪心策略我们拼出来的是bba
所以我们要放弃上面的想法,我们知道,我们最后比较的是拼接之后的大小,那我们直接拿拼接之后的对象比较不就好了嘛
我们让两个元素先拼接到一起,然后我们比较他们拼接的两种方式谁比较小这样的方式来排序,排序之后我们再让他们拼接就可以了。
举例
【"cd","a","e"】
我们先拿到第一个元素和第二个元素:"cd" , "a" 我们比较他们两个之间的拼接顺序,就是比较"acd" 和 "cda"
然后我们知道"acd"是小于"cda"
所以"a"排在"cd"前面.z
按照上面的顺序,我们知道cd应该在e的前面。
我们这边只是说一下排序的样子,没有说这样就排序好了。
最后排序好的结果就是【"a","cd","e"】
代码
比较器
public static class Com implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return (o1 + o2).compareTo(o2 + o1);
}
}
这个比较器就是思路里面写到的,比较两个字符串拼接之后的大小来安排谁在前面谁在后面。
实现方法
public static String lowestString(String[] strs){
if(strs == null || strs.length == 0){
return "";
}
Arrays.sort(strs , new Com());
StringBuilder string = new StringBuilder();
for(int i = 0;i<strs.length;i++){
string.append(strs[i]);
}
return string.toString();
}
这个就是用Arrays.sort在排序好之后,就可以拼接了。