举例:

  • strs = [“abc”, “de”],可以拼接成 “abcde”,也可以拼接成 “deabc”,但前者的字典顺序更小,所以返回 “abcde”
  • strs = [“b”, “ba”],可以拼成 “bba”,也可以拼成 “bab”,但前者的字典顺序更小,所以返回 “bab”。

基本思路: 
  有一种思路为:先把strs中的字符串按照字典顺序排序,然后将串起来的结果返回。这么做是错误的,例如【举例】中的第二条,按照字典顺序排应该是b、ba,串起来的结果是bba,但是正确答案是bab。所以这个思路行不通。正确的排序方式如下:
  假设两个字符分别是a,b。a和b拼起来的字符串表示为a.b,那么如果a.b的字典顺序小于b.a,就把a放在前面,否则把b放在前面。每两个字符之间都按照这个标准进行比较,以此标准排序后,最后串起来的结果就是正确答案

import java.util.*;
import java.util.Arrays;
import java.util.Comparator;

public class Solution {
    /**
     * 
     * @param strs string字符串一维数组 the strings
     * @return string字符串
     */
    public static class MyComparator implements Comparator<String>{
        public int compare(String a,String b){
            return (a+b).compareTo(b+a);
        }
    }

    public String minString (String[] strs) {
        // write code here
        if(strs==null || strs.length==0){
            return "";
        }
        Arrays.sort(strs,new MyComparator());
        StringBuffer res=new StringBuffer();
        for(int i=0;i<strs.length;i++){
            res.append(strs[i]);
        }
        return res.toString();
    }
}
import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int len = Integer.parseInt(br.readLine());
        String[] arr = new String[len];
        for(int i=0;i<len;i++){
            arr[i] = br.readLine();
        }
        String res = getRes(arr);
        System.out.println(res);
    }
    public static String getRes(String[] arr){
        if(arr==null||arr.length==0) return null;
        if(arr.length<2) return arr[0];
        Arrays.sort(arr,new Comparator<String>(){
            public int compare(String o1,String o2){
                return (o1+o2).compareTo(o2+o1);
            } 
        });
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<arr.length;i++){
            sb.append(arr[i]);
        }
        return sb.toString();
    } 

}