最近碰到一个问题,就是用javascript求数组中所有数字能拼接出的最大整数,数组的每一项为单独的拼接项,不能再拆开,例如[2,34]中2和34分别为要被拼接的数字,而不是说34还能继续拆分为3和4。
具体需求为,将[7,321,35,4]拼接为7435321。
我设计的算法如下:

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方法,代码就会简化很多。代码如下:

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就行比较,以此类推。

算法的整体思路是就是尽可能的保证高位数字比较大,难点在于处理首字母相同的字符串。感兴趣的小伙伴,如果有更好的思路或疑问,可以在下面评论中提出来。


安静的木马
957 声望11 粉丝