给定一个非负整数数组,将它们排成一个尽可能大的数

给定一个非负整数数组,将它们排成一个尽可能大的数,
例如,给定数组[9, 81, 6, 35, 3, 30],那最后得到的最大数是981635330.

"""
问题的实质是,新建一种规则判断两个数字的大小,
即 从左往右 依次比较两个数字的各位上的数,直到比到其中一个数字的最后一位
"""


## 获取数据: 非负整数数组
# x = input()
# x = list(map(int, eval(x)))
x = [9, 81, 6, 35, 3, 30]

def num_max(num1, num2):
    """使用新建的规则判断两个数字的大小"""
    num1str, num2str = str(num1), str(num2)
    n1, n2 = len(num1str), len(num2str)
    for i in range(min(n1, n2)):
        if num1str[i] > num2str[i]:
            return num1
        elif num1str[i] < num2str[i]:
            return num2
        else:
            if i == min(n1, n2)-1:
                if n1 <= n2:
                    return num1
                else:
                    return num2

x_order = []
def get_in_order(x):
    """调整原始数组中元素的位置,使按照新规则从大到小"""
    if not x:
        return 

    max_i = x[0]
    for i in range(1, len(x)):
        max_i = num_max(max_i, x[i])

    x_order.append(str(max_i))
    x.remove(max_i)
    get_in_order(x)

get_in_order(x)
print(''.join(x_order))     # 输出拼接的最大数字,以字符串的形式

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值