把数组排成最小的数

一世执手 提交于 2019-12-16 22:28:51

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

解题:

将各个元素从小到大进行排序,排序之后再把他们串联起来就可以了,全排列时间复杂度为O(n!)。要定义一个比较大小的函数,对拼接后的字符串进行比较。比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面。想到了贪心的思想,既然整个序列是最小的,那么越靠前的序列肯定也是最小的,任何两个序列的组合也是较小的。同时将两个字符串按不同顺序相加得到的长度总是相等的,此时就可以简单地使用compareTo的方法来做比较。
Comparator接口,两个对象要使用compareTo方法比较大小,就必须实现Comparator接口的compare方法,比如String就实现了这个方法,所以可以直接使用compareTo进行比较。sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。

public String PrintMinNumber(int [] numbers) {
        ArrayList<String> arrayList = new ArrayList<String>();
        for(int i : numbers){
            arrayList.add( i + "" );
        }
 
        Collections.sort(arrayList, (o1,o2)->(o1+o2).compareTo(o2+o1));
 
        StringBuilder stringBuilder2 = new StringBuilder();
        for(String s : arrayList){
            stringBuilder2.append(s);
        }
        return stringBuilder2.toString();
    }//

Comparator接口,两个对象要使用compareTo方法比较大小,就必须实现Comparator接口的compare方法,比如String就实现了这个方法,所以可以直接使用compareTo进行比较。sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。

若要自己定义规则,可以这么写: 

对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;
     }
 };

代码优化: 

class Solution {
public:
    string PrintMinNumber(vector<int> numbers) {
        int length = numbers.size();
        if(length == 0){
            return "";
        }
        sort(numbers.begin(), numbers.end(), cmp);
        string res;
        for(int i = 0; i < length; i++){
            res += to_string(numbers[i]);//把排好之后的数字拼接起来
        }
        return res;
    }
private:
    // 升序排序
    static bool cmp(int a, int b){
        string A = to_string(a) + to_string(b);
        string B = to_string(b) + to_string(a);
        return A < B;//写比较函数,ab  ba 比较
    }
};

 

 

public class Solution {
    public String PrintMinNumber(int [] numbers) {
        String str = "";
        for (int i=0; i<numbers.length; i++){
            for (int j=i+1; j<numbers.length; j++){//两两比较
                int a = Integer.valueOf(numbers[i]+""+numbers[j]);
                int b = Integer.valueOf(numbers[j]+""+numbers[i]);
                if (a > b){
                    int t = numbers[i];
                    numbers[i] = numbers[j];
                    numbers[j] = t;
                }
                 
            }
        }
        for (int i = 0; i < numbers.length; i++) {
            str += String.valueOf(numbers[i]);
        }
        return str;
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!