把数组排成最小的数
把数组排成最小的数
http://www.nowcoder.com/practice/8fecd3f8ba334add803bf2a06af1b993
这个题目自己的想法是全排列,然后将全排列的结果进行对比,求最小值。
看了一下题解,发现有非常巧妙的解法,得益于Java的Stream API,可以在3行之内完成本题,但是Stream API用于这种编程题的性能实在是惨不忍睹,没办法,实际的工程开发中还是会用Stream API的,以下是用纯Java 8风格代码进行的实现。
import java.util.*; import java.util.stream.*; public class Solution { public String PrintMinNumber(int [] numbers) { List<String> list = Arrays.stream(numbers) .boxed() // IntStream转Stream<Integer>,类似的有long与double的流 .map(String::valueOf) .collect(Collectors.toList()); // 上面一行也可以使用下面一行代替 // List<String> list = Arrays.stream(numbers).mapToObj(String::valueOf).collect(Collectors.toList()); Collections.sort(list, (o1, o2) -> (o1 + o2).compareTo(o2 + o1)); // 核心,注意排序的依据是什么 // return String.join("", list); // 下面一句也可以这么实现,String静态方法join同样是Java 8新特性 return list.stream().collect(Collectors.joining()); } }
这个题目一旦理解了解法,实现非常简单,但是如何能想到这个解法,是需要经验积累的。