如何用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"*10vs"98"*10,比较结果和"9"+"98"vs"98"+"9"的优先级一致) - 全0处理:防止数组全是0时输出
"0000...",直接返回"0"
这个方案是通用的,不管数组里的数字是几位,都能正确生成最大的拼接数。
内容的提问来源于stack exchange,提问作者Bishal Jain
相关产品推荐
相关产品推荐

