題目和靈感來(lái)源于掘金=>每天一道算法題及下方評(píng)論。
給定一個(gè)非負(fù)整數(shù)列表,重新排列他們的順序把他們組成一個(gè)最大的數(shù)輸出,轉(zhuǎn)成字符串的形式。
列入[30,34,5,9,3] => "9534330"
首先這很符合字符串比較大小的方式
兩字符串從第一個(gè)字符開(kāi)始比較,如果前n個(gè)都相同,則第n+1個(gè)大的字符串比較大
先寫(xiě)一個(gè)簡(jiǎn)單的排序
var a = [30,34,5,9,3]
a.sort(function(a,b){
return a+"" < b+"";
})
9,5,34,30,3
sort 方法可理解為如果返回true則a和b互換位置
發(fā)現(xiàn)第一位不同的可以簡(jiǎn)單的排序,位數(shù)相同的數(shù)也可以簡(jiǎn)單的處理,唯有位數(shù)不相同的數(shù)很特別
兩個(gè)數(shù)34,3 在源數(shù)組的位置不同會(huì)輸出不同的結(jié)果,顯示343 要大于334,在舉個(gè)例子31,3 顯然331是要大于313的
關(guān)鍵在于位數(shù)多的那個(gè),第一個(gè)與第一個(gè)字符不同的位置上的字符是否大于第一個(gè)字符
function combinationMaxNumber(arr){
let cloneArr = arr.map(function(e,i){
return e+"";
})
cloneArr.sort(function(a,b){
let i;
for( i=0;i<a.length && i<b.length;i++){
if(a.charAt(i) != b.charAt(i)){
return a.charAt(i) < b.charAt(i)
}
}
if(a.length > b.length){
return a.charAt(0) > a.charAt(i);
}
else{
return b.charAt(0) < b.charAt(i);
}
})
return cloneArr.join("");
}
想想之前的討論,"兩個(gè)數(shù)34,3 在源數(shù)組的位置不同會(huì)輸出不同的結(jié)果,顯示343 要大于334",字符串的相加能實(shí)現(xiàn)這種效果,于是
function combinationMaxNumber(arr){
var cloneArr = arr.slice().sort(function(a,b){
return (a+""+b) < (b+""+a);
})
return cloneArr.join("");
}