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

题目和灵感来源于掘金=>每天一道算法题及下方评论。

给定一个非负整数列表,重新排列他们的顺序把他们组成一个最大的数输出,转成字符串的形式。
列入[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<a.length && i<b.length;i++){
        if(a.charAt(i) != b.charAt(i)){
            return a.charAt(i) < b.charAt(i)
        }

    }
   
    if(a.length > 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("");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 6,266评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,658评论 0 5
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,621评论 0 4
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,890评论 0 2
  • iOS 基于GCDAsyncSocket快速开发Socket通信
    WolfTin阅读 201评论 0 0

友情链接更多精彩内容