【剑指offer】32:把数组排成最小的数

题目描述:

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

例如:

[3,32,321]

返回值:

'321323'

解题思路:

看到本题能想到的最直观的解法就是求出数组中所有数字的所有排列方式,然后比较所有的排列,最后找到最小的排列,但是时间复杂度为O(n!),所以不是一个好的解法。

显然上面的方法出现了太多的无关排序,我们可以从简单的情况入手,如果只有两个字符串的情况下,当a + b < b + a(字符串拼接,不是加法),因为a排在前面使得结果更小,所以我们希望a排在b前面。于是我们自定义规则,如果 a + b < b + a, 则a在b前面,如果a + b > b + a, 则b在a前面。按照这样的判定规则,我们只需在双重的for循环下申请一个临时变量,进行交换位置,比较完之后按顺序连接成一个字符串即可。

代码实现

(JavaScript实现):

function PrintMinNumber(numbers) {
    // write code here
    var result = '', temp = 0;
    if (numbers.length == 0) {
        return '';
    }
    if (numbers.length == 1) {
        return numbers[0];
    }
    for (let i = 0; i < numbers.length; i++) {
        for (let j = i + 1; j < numbers.length; j++) {
            if (numbers[i] + '' + numbers[j] > numbers[j] + '' + numbers[i]) {
                temp = numbers[i];
                numbers[i] = numbers[j];
                numbers[j] = temp;
            }
        }
        result += numbers[i];
    }
    return result;
}

 

posted @ 2021-04-27 21:13  zhang十六  阅读(65)  评论(0编辑  收藏  举报