算法=>组合出最大数的最优解推导

题目和灵感来源于掘金=>每天一道算法题及下方评论。

给定一个非负整数列表,重新排列他们的顺序把他们组成一个最大的数输出,转成字符串的形式。
列入[30,34,5,9,3] => "9534330"

首先这很符合字符串比较大小的方式

两字符串从第一个字符开始比较,如果前n个都相同,则第n+1个大的字符串比较大

先写一个简单的排序

var a = [30,34,5,9,3]
a.sort(function(a,b){
return a+"" < b+"";
})

9,5,34,30,3

sort 方法可理解为如果返回true则a和b互换位置

发现第一位不同的可以简单的排序,位数相同的数也可以简单的处理,唯有位数不相同的数很特别

两个数34,3 在源数组的位置不同会输出不同的结果,显示343 要大于334,在举个例子31,3 显然331是要大于313的

关键在于位数多的那个,第一个与第一个字符不同的位置上的字符是否大于第一个字符

function combinationMaxNumber(arr){

let cloneArr = arr.map(function(e,i){
    return e+"";
}) 
cloneArr.sort(function(a,b){
    let i;
    for( i=0;i b.length){
        return a.charAt(0) > a.charAt(i);
    }
    else{
        return b.charAt(0) < b.charAt(i);
    }
    
        

})
return cloneArr.join("");
}

想想之前的讨论,"两个数34,3 在源数组的位置不同会输出不同的结果,显示343 要大于334",字符串的相加能实现这种效果,于是

function combinationMaxNumber(arr){

var cloneArr = arr.slice().sort(function(a,b){
    
    return (a+""+b) < (b+""+a); 
})
return cloneArr.join("");
}

你可能感兴趣的:(算法=>组合出最大数的最优解推导)