You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript从数组生成最大数?求多位数通用解决方案

数组生成最大数的通用实现方案

嗨,我完全懂你遇到的困扰——之前的方案只对两位数数组有效,碰到混合位数的数字就失灵了对吧?别着急,咱们来搞定这个通用解法,不管数组里是一位数、两位数还是多位数,都能生成正确的最大数。

核心思路:比拼接结果,不比数值大小

为什么普通的数字排序不行?举个例子:数组里的9和98,单看数值9 < 98,但拼接起来998比989更大,所以正确的排序逻辑应该是比较两个数字拼接后的字符串大小,而不是数字本身的数值大小。

具体步骤如下:

  • 把数组里的所有数字转换成字符串,方便直接拼接比较
  • 自定义排序规则:对于任意两个字符串a和b,如果a+b的结果比b+a大,就把a排在b的前面(降序逻辑)
  • 排序完成后拼接所有字符串,同时处理特殊情况:如果拼接结果以0开头(比如数组全是0),直接返回"0"而非一串0

代码实现(Python)

这里提供两种写法,一种是更直观的自定义比较函数,另一种是更简洁的排序技巧:

写法1:自定义比较函数(直观易理解)

from functools import cmp_to_key

def largest_number(arr):
    # 将数组元素转为字符串
    str_arr = list(map(str, arr))
    
    # 定义比较规则:a+b > b+a 则a排在b前面
    def compare(a, b):
        if a + b > b + a:
            return -1  # 降序排列,返回-1表示a优先级更高
        else:
            return 1
    
    # 使用自定义比较函数排序
    str_arr.sort(key=cmp_to_key(compare))
    
    # 拼接结果,处理全0情况
    result = ''.join(str_arr)
    return result if result[0] != '0' else '0'

# 测试你的数组
arr = [1,3,34,44,4,45,6,76,9,98,23]
print(largest_number(arr))  # 输出:99876645444343231

写法2:简洁的排序技巧(高效)

def largest_number(arr):
    str_arr = list(map(str, arr))
    # 用x*10模拟无限拼接比较,适合不同长度的字符串
    str_arr.sort(key=lambda x: x*10, reverse=True)
    result = ''.join(str_arr)
    return result if result[0] != '0' else '0'

# 测试同样有效
arr = [1,3,34,44,4,45,6,76,9,98,23]
print(largest_number(arr))  # 输出:99876645444343231

代码解释

  • 字符串转换:把数字转成字符串是为了直接拼接比较,避免数值运算带来的位数问题
  • 自定义排序:第一种写法用cmp_to_key把比较函数转换成排序键,逻辑清晰;第二种写法用x*10是因为当字符串长度不同时,重复多次可以等价于无限拼接的比较(比如"9"*10 vs "98"*10,比较结果和"9"+"98" vs "98"+"9"的优先级一致)
  • 全0处理:防止数组全是0时输出"0000...",直接返回"0"

这个方案是通用的,不管数组里的数字是几位,都能正确生成最大的拼接数。

内容的提问来源于stack exchange,提问作者Bishal Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:29:28