这个题目自己的想法是全排列,然后将全排列的结果进行对比,求最小值。

看了一下题解,发现有非常巧妙的解法,得益于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());
    }
}

这个题目一旦理解了解法,实现非常简单,但是如何能想到这个解法,是需要经验积累的。