算法=>组合出最大数的最优解推导

题目和灵感来源于掘金=>每天一道算法题及下方评论。 给定一个非负整数列表,重新排列他们的顺序把他们组成一个最大的数输出,转成字符串的形式。 列入[30,34,5,9,3] => "9534330" 首先这很符合字符串比较大小的方式 两字符串从第一个字符开始比较,如果前n个都相同,则第n+1个大的字符串比较大 先写一个简单的排序 var a = [30,34,5,9,3] a.sort(function(a,b){ return a+"" < b+""; }) 9,5,34,30,3 sort 方法可理解为如果返回true则a和b互换位置 发现第一位不同的可以简单的排序,位数相同的数也可以简单的处理,唯有位数不相同的数很特别 两个数34,3 在源数组的位置不同会输出不同的结果,显示343 要大于334,在举个例子31,3 显然331是要大于313的 关键在于位数多的那个,第一个与第一个字符不同的位置上的字符是否大于第一个字符 function combinationMaxNumber(arr){ let cloneArr = arr.map(function(e,i){ return e+""; }) cloneArr.sort(function(a,b){ let i; for( i=0;i b.length){ return a.charAt(0) > a.charAt(i); } else{ return b.charAt(0) < b.charAt(i); } }) return cloneArr.join(""); } 想想之前的讨论,"两个数34,3 在源数组的位置不同会输出不同的结果,显示343 要大于334",字符串的相加能实现这种效果,于是 function combinationMaxNumber(arr){ var cloneArr = arr.slice().sort(function(a,b){ return (a+""+b) < (b+""+a); }) return cloneArr.join(""); }

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: