资讯专栏INFORMATION COLUMN

js求数组中所有数字可以拼接出的最大整数

hss01248 / 471人阅读

摘要:最近碰到一个问题,就是用求数组中所有数字能拼接出的最大整数,数组的每一项为多带带的拼接项,不能再拆开,例如中和分别为要被拼接的数字,而不是说还能继续拆分为和。具体需求为,将拼接为。

最近碰到一个问题,就是用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 (aIndexb[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 (aIndexb[bIndex]){
            return -1;
        }else{
            return 1;
        }
    });
    console.log(newArr);
    return newArr.join("");
}

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

现在整体讲下上面算法的思路:

将数组中所有数字转为字符串,按照首字母大小进行整体排序。

如果首字母相同,就通过while循环向后比较,比如52和53比较时,首字母5相同就比较2和3,如果相比较的两个字符串长度不一样,先被循环完的字符串将始终用最后一位字母进行后续比较,比如523和52进行比较时,前两位相同,523的3就和52中的最后一位2就行比较,以此类推。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84872.html

相关文章

  • 复习js 2

    摘要:复习表达式和运算符运算符拥有如下类型的运算符。例如十进制数字用二进制表示为,位运算符就是在这个二进制表示上执行运算,但是返回结果是标准的数值。因此,用于布尔值时,当任何一个操作数为则返回如果操作数都是则返回。 复习js day2 表达式和运算符 运算符 JavaScript 拥有如下类型的运算符。本节描述了运算符和运算符的优先级。 赋值运算符(Assignment operators...

    yhaolpz 评论0 收藏0
  • web前端教程《每日一题》(1-99)完结

    摘要:输出在中,值表示一个空对象指针,而这正是使用操作符检测值时会返回的原因。属性规定必需在提交之前填写输入字段。通过字面量方式创建的数组对象是属于类的一个实例,所以返回,故弹出。第期年月日代码运行的结果输出前端教程。 第1期(2016年4月6日): (1)js中关闭当前窗口的方法是:window.close(); 第2期(2016年4月7日): (1)js中使字符串中的字符变为小写的方法是...

    fox_soyoung 评论0 收藏0
  • web前端教程《每日一题》(1-99)完结

    摘要:输出在中,值表示一个空对象指针,而这正是使用操作符检测值时会返回的原因。属性规定必需在提交之前填写输入字段。通过字面量方式创建的数组对象是属于类的一个实例,所以返回,故弹出。第期年月日代码运行的结果输出前端教程。 第1期(2016年4月6日): (1)js中关闭当前窗口的方法是:window.close(); 第2期(2016年4月7日): (1)js中使字符串中的字符变为小写的方法是...

    golden_hamster 评论0 收藏0
  • web前端教程《每日一题》(1-99)完结

    摘要:输出在中,值表示一个空对象指针,而这正是使用操作符检测值时会返回的原因。属性规定必需在提交之前填写输入字段。通过字面量方式创建的数组对象是属于类的一个实例,所以返回,故弹出。第期年月日代码运行的结果输出前端教程。 第1期(2016年4月6日): (1)js中关闭当前窗口的方法是:window.close(); 第2期(2016年4月7日): (1)js中使字符串中的字符变为小写的方法是...

    forsigner 评论0 收藏0

发表评论

0条评论

hss01248

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<