import java.util.*;
import java.util.stream.Collectors;

/**
 * NC270 把数组排成最小的数
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 相似 -> NC85 拼接所有的字符串产生字典序最小的字符串   [nowcoder]
     *
     * @param numbers int整型一维数组
     * @return string字符串
     */
    public String PrintMinNumber (int[] numbers) {
        // int[] -> Integer[]
        // return solution1(Arrays.stream(numbers).boxed().toArray(Integer[]::new));
        // int[] -> List<String>
        return solution2(Arrays.stream(numbers).mapToObj(String::valueOf).collect(Collectors.toList()));
        // int[] -> List<String>
        // return solution2(Arrays.stream(numbers).boxed().map(String::valueOf).collect(Collectors.toList()));

    }

    /**
     * 贪心+排序
     * @param numbers
     * @return
     */
    private String solution1(Integer[] numbers){
        // "32" "321"
        // 直接比较字典 32<321              => 32321
        // 连接比较字典 32>321(32321>32132) => 32132
        // 升序
        // Arrays.sort(numbers, (o1, o2) -> (String.valueOf(o1)+String.valueOf(o2)).compareTo(String.valueOf(o2)+String.valueOf(o1)));
        Arrays.sort(numbers, new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2){
                return (String.valueOf(o1)+String.valueOf(o2)).compareTo(String.valueOf(o2)+String.valueOf(o1));
            }
        });

        StringBuilder sb = new StringBuilder();
        for(Integer num: numbers){
            sb.append(num);
        }

        return sb.toString();
    }

    /**
     * 贪心+排序
     * @param numbers
     * @return
     */
    private String solution2(List<String> numbers){
        // "32" "321"
        // 直接比较字典 32<321              => 32321
        // 连接比较字典 32>321(32321>32132) => 32132
        // 升序
        // Collections.sort(numbers, (o1, o2) -> (o1+o2).compareTo(o2+o1));
        numbers.sort((o1, o2) -> (o1+o2).compareTo(o2+o1));

        StringBuilder sb = new StringBuilder();
        for(String num: numbers){
            sb.append(num);
        }

        return sb.toString();
    }
}