把数组排成最小的数

70 阅读1分钟

题目描述

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

个人理解和感觉,题目不是很难,比较简单,但是有需要注意的地方,1,数字的拼接不能用int或者long,数组很大会溢出。2,排序规则,要重新定义,根据,a和b的前后顺序不一样,可以得到两个数,ab和ba比较ab和ba,如果ab>ba那么a就大于b,反之,b小于a。有了新的排序规则,接下来先择一个排序算法就可以了。 下面用的是冒泡,比较好理解。也可以用快排等一些时间复杂度比较低的排序算法。

public String PrintMinNumber(int [] numbers) {
    String[] ass= new String[numbers.length];
        for (int i = 0; i < numbers.length; i++) {
            ass[i] = String.valueOf(numbers[i]);
        }
        String res = "";
        for (int i = 0; i < ass.length; i++) {
            for (int j = i+1; j < ass.length; j++) {
                String str1 = ass[i]+ass[j];
                String str2 = ass[j]+ass[i];
                if (compare(str1, str2)==1) {
                    String a = ass[i];
                    ass[i] = ass[j];
                    ass[j] = a;
                }
            }
            res+=ass[i];
        }
 //     System.out.println(res)
        return res;
    }

    static int compare(String str1,String str2){
        for (int i = 0; i < str1.length(); i++) {
            if (str1.charAt(i)>str2.charAt(i)) {
                return 1;
            }else if (str1.charAt(i)<str2.charAt(i)) {
                return -1;
            }
        }
        return 0;
    }