输入一个非负整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 
   例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。 
   1.输出结果可能非常大,所以你需要返回一个字符串而不是整数
2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
 
 2.拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
  数据范围: 
   0<=len(numbers)<=100  
                                        [11,3]
"113"
[]
""
[3,32,321]
"321323"
# -*- coding:utf-8 -*-
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers:return ""
        numbers = list(map(str,numbers))
        numbers.sort(cmp=lambda x,y:cmp(x+y,y+x))
        return '0' if numbers[0]=='0' else ''.join(numbers)
经过@zhejiangblue提醒, 最后一行写的有问题,最终改成:
class Solution:
    def PrintMinNumber(self, numbers):
        # write code here
        if not numbers: return ""
        numbers = list(map(str, numbers))
        numbers.sort(cmp=lambda x, y: cmp(x + y, y + x))
        return "".join(numbers).lstrip('0') or'0'
```
class Solution {
public:
    static bool compare( const string &st1,const string &st2){
        string s1 = st1+st2;
        string s2 = st2+st1;
        return s1<s2;
    }
    string PrintMinNumber(vector<int> numbers) {
         string result;
        if(numbers.size()<=0){
            return result;
        }
        vector<string> strNum;
        for(int i=0;i<numbers.size();i++ ){
           stringstream ss;
            ss<<numbers[i];
            string s = ss.str();
            strNum.push_back(s);
        }
        sort(strNum.begin(),strNum.end(),compare);
       
        for(int i=0;i<strNum.size();i++){
            result.append(strNum[i]);
        }
        return result;
        
    }
};
class Solution {
public:
    //如果题目要求得出最大的数字,可以将比较器转换成从大到小排序即可
   //其中,数字转化为字符串的使用方法,参考别人的代码%>_<%
 static int compare(const string& st1,const string& st2)
    {
        string s1=st1+st2;
        string s2=st2+st1;
        return s1<s2;//降序排列,改为大于就是升序排列!!!
    }
    string PrintMinNumber(vector<int> numbers) {
        string result;
        if(numbers.size()<=0) return result;
        vector<string> vec;
        for(unsigned int i=0;i<numbers.size();i++)
        {
            stringstream ss;//使用输入输出流,头文件要包含#include<sstream>
            ss<<numbers[i];//读入数字给流处理
            string s = ss.str();//转换成字符串
            vec.push_back(s);//将字符串s压入vec中
        }
        //排序,传入比较器,从小到大排序
        sort(vec.begin(),vec.end(),compare);
        for(unsigned int i=0;i<vec.size();i++)
        {
            result.append(vec[i]);//拼接字符串,这就是最小的数字
        }
        return result;
    }
};
string itos(int x){
    return (x > 9 ? itos(x / 10) : "") + char(x % 10 + '0');
}
bool cmp(int a, int b){
    return itos(a) + itos(b) < itos(b) + itos(a);
}
class Solution {
public:
    string PrintMinNumber(vector<int> a) {
        sort(a.begin(), a.end(), cmp);
        string s = "";
        for(int i = 0; i < int(a.size()); ++i) s += itos(a[i]);
        return s;
    }
};
  class Solution {
public:
    string PrintMinNumber(vector<int> numbers){
        string ret;
        vector<string> numbers_str;
        for(int i = 0; i < numbers.size(); ++i)
            numbers_str.push_back(to_string(numbers[i]));        
        sort(numbers_str.begin(), numbers_str.end(), MyCompare);
        for(int i = 0; i < numbers_str.size(); ++i)
            ret += numbers_str[i];        
        return ret;
    }
private:
    static bool MyCompare(const string &str1, const string &str2){
		return str1 + str2 < str2 + str1;
    }
};
// 利用lambda的简洁解法
import java.util.*;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String[] strs = new String[numbers.length];
        for(int i = 0; i < numbers.length; i++)
            strs[i] = String.valueOf(numbers[i]);
        return Arrays.stream(strs)
                    .sorted((x, y) -> (x + y).compareTo(y + x))
                    .reduce("", (x, y) -> x + y);
    }
} class Solution {
public:
    static bool cmp(int x, int y){
        return to_string(x) + to_string(y) < to_string(y) + to_string(x);
    }
    string PrintMinNumber(vector<int> numbers) {
        sort(numbers.begin(), numbers.end(), cmp);
        string ans = "";
        for(int i = 0; i < numbers.size(); i++) 
            ans += to_string(numbers[i]);
        return ans;
    }
};
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        List<String> s = Arrays.stream(numbers).mapToObj(c -> c + "").sorted((o1, o2)->(o1 + o2).compareTo(o2 + o1)).collect(Collectors.toList());
        return s.stream().collect(Collectors.joining());
    }
} bool compare(int m, int n) //定义sort中的比较规则
{
    string mn =
  to_string(m) + to_string(n);
    string nm = to_string(n) +
  to_string(m);
    if(strcmp(mn.c_str(), nm.c_str()) > 0)
  //m>n
        return false;
    else
        return true;
}
class Solution
{
    public:
        string
  PrintMinNumber(vector numbers)
        {
            string
  ret;
            if(numbers.size() == 0)
                return
  ret;
            sort(numbers.begin(), numbers.end(), compare);
  for(int i = 0; i < numbers.size(); i++)
            {
  ret = ret + to_string(numbers[i]);
            }
  return ret;
        }
};
package com.code.offer;
import java.util.*;
/**
 * Created by jiangchao on 2016/10/9.
 */
public class Solution32 {
    public String PrintMinNumber(int [] numbers) {
       if (numbers == null || numbers.length == 0) return "";
       MyComparator myComparator = new MyComparator();
        List<Integer> list = new ArrayList<Integer>();
        for (int i : numbers) {
            list.add(i);
        }
        Collections.sort(list, myComparator);
        StringBuilder sb = new StringBuilder();
        for (Integer val : list) {
            sb.append(val);
        }
        return sb.toString();
    }
    private class MyComparator implements Comparator<Integer> {
        @Override
        public int compare(Integer o1, Integer o2) {
            String s1 = String.valueOf(o1);
            String s2 = String.valueOf(o2);
            String str1 = s1+s2;
            String str2 = s2+s1;
            return str1.compareTo(str2);
        }
    }
}
import java.util.ArrayList;
import java.util.ArrayList;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        if(numbers==null||numbers.length==0)
            return "";
        if(numbers.length==1)
            return ""+numbers[0];
		String[] str = new String[numbers.length];
        
        for(int i = 0;i<numbers.length;i++){
            str[i] = ""+numbers[i];
        }
        sort(str);
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i<str.length;i++){
            sb.append(str[i]);
        }
        return sb.toString();
    }
    
    private void sort(String[] s){
        for(int i = 0;i<s.length-1;i++){
            boolean flag = true;
            for(int j = 0;j<s.length-i-1;j++){
                if((s[j]+s[j+1]).compareTo(s[j+1]+s[j])>0){
                    String t = s[j+1];
                    s[j+1] = s[j];
                    s[j] = t;
                    flag = false;
                }
            }
            if(flag)
                return;
        }
        
    }
}
import java.util.*;
public class Solution {
    public String PrintMinNumber(int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            return "";
        }
        Integer[] nums = Arrays.stream(numbers).boxed().toArray(Integer[]::new);
        Arrays.sort(nums, (o1, o2) -> ("" + o1 + o2).compareTo("" + o2 + o1));
        StringBuilder sb = new StringBuilder();
        for (int num : nums) {
            sb.append(num);
        }
        return sb.toString();
    }
}
 根据最高票答案,改成JDK1.8,简洁易懂。
public String PrintMinNumber(int [] numbers) {
        ArrayList<Integer> list = new ArrayList();
        Arrays.stream(numbers).forEach(list::add);
        list.sort((str1, str2) -> {
            String s1 = str1 + "" + str2;
            String s2 = str2 + "" + str1;
            return s1.compareTo(s2);
        });
        String s = "";
        for (int j : list) {
            s += j;
        }
        return s;
    }
                                                                                    public class Solution {
    public String PrintMinNumber(int[] numbers) {
        if(numbers.length == 0 || numbers == null) return "";
        
        int j;
        for(int i = 1; i < numbers.length; i++) {
            int t = numbers[i];
            for(j = i; j > 0 && compare(t, numbers[j-1]) < 0; j--)
                numbers[j] = numbers[j-1];
            numbers[j] = t;
        }
        
        String result = "";
        for(int e:numbers)
            result += e;
        return result;
    }
    
    private int compare(int a, int b) {
        String s1 = "" + a + b;
        String s2 = "" + b + a;
        return s1.compareTo(s2);
    }
}   
class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
  if (numbers.empty())
  {
   return string();
  }
  string res;
  vector<string> strNum(numbers.size());
  for (size_t i = 0; i < numbers.size(); i++)
  {
   stringstream ss;
   ss << numbers[i];
   strNum[i].append(ss.str());
  }
  sort(strNum.begin(), strNum.end(), [=](string a, string b) {
   string s1 = a + b;
   string s2 = b + a;
   return s2 > s1;
  });
  for (int i = 0; i<strNum.size(); i++) {
   res.append(strNum[i]);
  }
  return res;
} };
/*对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+b<b+a a排在在前 的规则排序, 如 2 21 因为 212 < 221 所以 排序后为 21 2 to_string() 可以将int 转化为string */ class Solution { public: static bool cmp(int a,int b){ string A=""; string B=""; A+=to_string(a); A+=to_string(b); B+=to_string(b); B+=to_string(a); return A<B; } string PrintMinNumber(vector<int> numbers) { string answer=""; sort(numbers.begin(),numbers.end(),cmp); for(int i=0;i<numbers.size();i++){ answer+=to_string(numbers[i]); } return answer; } };
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
public String PrintMinNumber(int [] numbers) {
int n;
String s="";
ArrayList<Integer> list= new ArrayList<Integer>();
n=numbers.length;
for(int i=0;i<n;i++){
list.add(numbers[i]);
}
Collections.sort(list, new Comparator<Integer>(){
public int compare(Integer str1,Integer str2){
String s1=str1+""+str2;
String s2=str2+""+str1;
return s1.compareTo(s2);
}
});
for(int j:list){
s+=j;
}
return s;
}
}