剑指Offer-39.把数组排成最小的数(C++/Java)

题目:

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。

分析:

将数组元素按照特定的规则从小到大排列,最后遍历数组拼接字符串即可,但重点是什么样的规则。

在比较3和321的大小时,我们希望得到321小于3,这样拼接出来的数字3213是要小于3321,所以两个数字a和b比较大小时,将它们转换成字符串形式拼接成ab和ba来比较,ab小于ba则a小于b,根据这样的规则,将数组重新进行排序,最后拼接起来便是最小的数字了。

程序:

C++

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        if(numbers.size() == 0)
            return "";
        sort(numbers.begin(), numbers.end(), cmp);
        string res = "";
        for(auto i:numbers)
            res += to_string(i);
        return res;
    }
    static bool cmp(int a, int b){
        string strA = "" + to_string(a) + to_string(b);
        string strB = "" + to_string(b) + to_string(a);
        return strA < strB;
    }
};

Java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String res = "";
        for(int i = 0; i < numbers.length; 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){
            res += j;
        }
        return res;
    }
    private ArrayList<Integer> list=new ArrayList<>();
}
posted @ 2019-12-17 17:07  silentteller  阅读(362)  评论(0编辑  收藏  举报