33 把数组排成最小的数(重用了全排列或者重写sort函数,比较器(差点)比较的是str1+str2 与 str2+str1)

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

1、想法很简单,求这三个数做一个全排列,然后将其最小数输出即可!

import java.util.*;

public class Solution {
    public void swap(int [] numbers,int i,int j){
        int tmp = numbers[i];
        numbers[i] = numbers[j];
        numbers[j] = tmp;
    }
    public ArrayList<String> Permutation(ArrayList<String> list,int [] numbers,int start,int end){
        if(start == end){
            String str = "";
            for(int i=0;i<numbers.length;i++){
                str += numbers[i];
            }
            list.add(str);
            //return list;
        }else{
            for(int i=start;i<=end;i++){
                swap(numbers,start,i);
                list = Permutation(list,numbers,start+1,end);
                swap(numbers,start,i);
            }
        }                               
        return list;
    }
    public String PrintMinNumber(int [] numbers) {
        if(numbers.length == 0){
            return "";
        }
        ArrayList<String> list = new ArrayList();
        list = Permutation(list,numbers,0,numbers.length-1);
        Collections.sort(list);
        return list.get(0);
    }
}

2、没必要把每一种情况都求出来呀!更简单的是:转换成字符数组,直接对其字典排序,然后连接起来即可!

补充begin:
比较两个数字,即给定两个数字m和n,我们要确定一个规则判断m和n哪个应该排在前面,而不是仅仅比较这两个数的大小。

m和n的拼接原则:mn或者nm。需要根据mn和nm的大小来定义排序规则。

由于m和n都是int能表达的数,把它们拼接成nm或mn可能就溢出了。==》所以还是一个大数问题。===》转换为字符串。
补充end;

sort()函数有两种:Collections.sort(。。。) 和 Arrays.sort(。。。。);
(1)Collections.sort()的参数是List类型,而Arrays.sort(。。。。)的参数是一个数组类型!
(2)这两种的排序都可以有第二个参数Comparator:

Arrays.sort(T[],Comparator<? super T> c);
Collections.sort(List<T> list,Comparator<? super T> c);

(应该不能做字典排序,而是根据str1+str2 与 str2+str1排序)
代码如下:

import java.util.*;

public class Solution {

    public String PrintMinNumber(int [] numbers) {
        if(numbers.length == 0){
            return "";
        }
        ArrayList<String> list = new ArrayList();
        for(int i=0;i<numbers.length;i++){
            list.add(""+numbers[i]);
        }       
        //注意:这里的String
        Collections.sort(list,new Comparator<String>(){
            public int compare(String a,String b){
                String str1 = a + b;//这里很巧妙
                String str2 = b + a;
                return str1.compareTo(str2);
            }
        });
        String res = "";
        for(int i=0;i<list.size();i++){
            res += list.get(i);
        }
        return res;
    }
}

感觉这个比较器很巧妙!!!不知道能不能写另一种比较器:如果第一位相同,比较第二位,如果没下一位了,则是小的。

Comparator接口,两个对象要使用compareTo方法比较大小,就必须实现Comparator接口的compare方法,比如String就实现了这个方法,所以可以直接使用compareTo进行比较。sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序。
返回正值代表大于,返回0代表等于,返回负值代表小于。这样就可以自定义排序方法。
这个还需要重新学习一下!关于比较规则的重写!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值