js求數組中全部數字能夠拼接出的最大整數

最近碰到一個問題,就是用javascript求數組中全部數字能拼接出的最大整數,數組的每一項爲單獨的拼接項,不能再拆開,例如[2,34]中2和34分別爲要被拼接的數字,而不是說34還能繼續拆分爲3和4。
具體需求爲,將[7,321,35,4]拼接爲7435321。
我設計的算法以下:javascript

function insertSort(arr) {
    let res = [arr[0]];
    for (let i = 1, len = arr.length; i < len; i++) {
        let temp = arr[i];
        for (let j = i - 1; j >= 0; j--) {
            if (!compareNum(res[j],temp)) {
                res[j + 1] = res[j];
                res[j] = temp;
            } else {
                res[j + 1] = temp;
                break;
            }
        }
    }
    return res;
}
function compareNum(a,b) {
    a =""+a;
    b = ""+b;
    let aLen=a.length;
    let bLen=b.length;
    let aIndex=0;
    let bIndex=0;

    while (aIndex<aLen && bIndex<bLen){
        let flag=false;
        if (a[aIndex]==b[bIndex]){
            aIndex+1<aLen && (aIndex++,flag=true);
            bIndex+1<bLen && (bIndex++,flag=true);
        }else{
            break;
        }
        if (!flag){
            break;
        }
    }
    if (a[aIndex]>b[bIndex]){
        return true;
    }else{
        return false;
    }
}
let arr=[5,2,1,38];
// let arr=[5,2,1,38,52,4,5,593,8,55,555,492,493,7,9,61,66,6];
// let arr=[5,2,1,38,52,4,5,593,61,6];

function toInt(arr) {
    let newArr=insertSort(arr);
    document.write(newArr);
    return newArr.join("");
}

let intNum=toInt(arr);
console.log(intNum);

上面算法用的是本身封裝的insertSort插入排序。
數組自身有sort方法,若是借用Array.prototype.sort方法,代碼就會簡化不少。代碼以下:java

var arr = [5,552,5,542,522,525,523,597,550,555,50,52];
function toInt(arr) {
    let newArr=arr.sort((a,b)=>{
        a =""+a;
        b = ""+b;
        let aLen=a.length;
        let bLen=b.length;
        let aIndex=0;
        let bIndex=0;

        while (aIndex<aLen && bIndex<bLen){
            let flag=false;
            if (a[aIndex]==b[bIndex]){
                aIndex+1<aLen && (aIndex++,flag=true);
                bIndex+1<bLen && (bIndex++,flag=true);
            }else{
                break;
            }
            if (!flag){
                break;
            }
        }
        if (a[aIndex]>b[bIndex]){
            return -1;
        }else{
            return 1;
        }
    });
    console.log(newArr);
    return newArr.join("");
}

let intNum=toInt(arr);
console.log(intNum);

如今總體講下上面算法的思路:算法

  1. 將數組中全部數字轉爲字符串,按照首字母大小進行總體排序。
  2. 若是首字母相同,就經過while循環向後比較,好比52和53比較時,首字母5相同就比較2和3,若是相比較的兩個字符串長度不同,先被循環完的字符串將始終用最後一位字母進行後續比較,好比523和52進行比較時,前兩位相同,523的3就和52中的最後一位2就行比較,以此類推。

算法的總體思路是就是儘量的保證高位數字比較大,難點在於處理首字母相同的字符串。感興趣的小夥伴,若是有更好的思路或疑問,能夠在下面評論中提出來。數組

相關文章
相關標籤/搜索