把数组排成最小的数

题目

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

例如

输入数组{3,32,321}

这3个数字能排成的最小数字321323.

思路

思路一

暴力算法,全排列所有的数字,选出最小的数字。时间复杂度为O(n!).

思路二

对于数字m和数字n,重新定义一种大小关系

如果mn > nm ,m 大于 n

如果nm > mn n 大于 m

如果 mn = nm n 等于 m

然后按照新定义的大小关系重新排列数组。次数得到最小的数组。

证明

证明计较两个数字大小的关系是有效的。

(1)自反性。显然有aa等于aa .

(2)对称性。 如果a 大于 b,有ba < ab。所以 b 小于 a.

(3) 传递性。从 a 大于 b,b 大于 c.证明a大于c.

 

证明重新排列数组后的值是有效的。

使用反证法证明。

代码

public static void printMinNumber(int[] numbers,int length){
    String[] strs = new String[length];
    for(int i = 0;i < length;i++){
        strs[i] = String.valueOf(numbers[i]);
    }
    sort(strs);
    for(int i = 0;i < length;i++){
        System.out.print(strs[i]);
    }

}
public static int compare(String str1,String str2){
    String str11 = str1.concat(str2);
    String str22 = str2.concat(str1);
    return str11.compareTo(str22);
}
public static void sort(String[] strs){
    for(int i = 0;i < strs.length - 1;i++){
        String min = strs[i];
        int index = i;
        for(int j = i + 1;j < strs.length;j++){
            if(compare(strs[j],min) < 0){
                index = j;
                min = strs[j];
            }
        }
        //swap(strs[i],strs[index]);
        String temp = strs[i];
        strs[i] = strs[index];
        strs[index] = temp;
    }
}

总结

本题需要证明数字的比较关系,以及证明数组重新排列后的值最小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值