最近碰到一个问题,就是用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);
如今总体讲下上面算法的思路:算法
算法的总体思路是就是尽量的保证高位数字比较大,难点在于处理首字母相同的字符串。感兴趣的小伙伴,若是有更好的思路或疑问,能够在下面评论中提出来。数组