Python实现,输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实现,输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接相关的知识,希望对你有一定的参考价值。

题目:输入一个正数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组3,32,321,则打印出这3个数字能排成的最小数字321323。 要求使用Python3实现,并且给出思路,非懂勿扰,谢谢分享!
import itertools
# data = 3, 32, 321, 3432, 435, 64, 324
data = 3, 32, 321
x = list(itertools.permutations(data)) #对data中的数据进行排列组合
print(x)
new_data=set()
for i in x:
n_str = ''.join(str(n) for n in i)
new_data.add(n_str)
min_n = int(sorted(new_data)[0])
print(min_n)
根据:sort函数只定义在list中,sorted函数对于所有的可迭代序列都可以定义,我将下面代码做了修改,请帮忙看下是否正确,谢谢!

你的例子第一列全是 3,我给个例子吧:[321, 32, 3, 4],输出该是 321,32,3,4。

第一个数越大,则应该排在后面,毕竟 4XXX 是比 3XXX 大的。

setp 1: [0][1][2]
         3  2  1
         3  2
         3
         4
排序第 0 列,越大的排越后。
ret = [?, ?, ?, 4]

setp 2: [0][1][2]
         3  2  1
         3  2
         3 <3>     <- 补位 3,因为 3 是同 3 组第一个元素。
排序第 1 列,越大的排越后。
ret = [?, ?, 3, 4]

setp 3: [0][1][2]
         3  2  1
         3  2 <3>  <- 补位 3,因为 3 是同 3 组第一个元素。
排序第 2 列,越大的排越后。323 比 321 大,所以……
ret = [?, 32, 3, 4]

只剩一个,那个排第一:
ret = [321, 32, 3, 4]

以上就是基本思路了。综上可得:

1. 先按 [0] 列分组:

2. 组中每个数都补位到同样长度,然后再排序。

完整代码:

def joinmin(ls):
    groups = 
    for item in ls:
        prefix = item
        n = 0
        while prefix > 10:
            prefix //= 10
            n += 1
        groups.setdefault(prefix, []).append([item, n])
    sorted_keys = list(sorted(groups))
    ret = 0
    for prefix in sorted_keys:
        items = groups[prefix]
        max_n = max([t[1] for t in items])
        presort_items = []
        for item, item_n in items:
            padding = item
            n = item_n
            while max_n > n:
                padding *= 10
                padding += prefix
                n += 1
            presort_items.append((padding, item, item_n))
        for _, item, n in sorted(presort_items):
            while n > -1:
                ret *= 10
                n -= 1
            ret += item
    return ret

不是看在你的分上答的,不过这种小题目蛮有趣的。

参考技术A import itertools

data = 3, 32, 321, 3432, 435, 64, 324     # 最小组合数结果 321323243343243564
# data = 3, 32, 321     # 最小组合数结果    321323

# 1、首先 data 是一个 set 集合,需要将其转换为 列表进行排序    sorted(list(data)))
# 2、然后通过python的内置库 itertools.permutations   进行排列组合
x = list(itertools.permutations(sorted(list(data))))

# 3、将排列组合出来的数先转为字符串
# 4、然后通过 join 将其组合成一个字符串
# 5、将组合出的数字字符串加入新的 set 集合中
new_data = set()
for i in x:
    n_str = "".join([str(n) for n in i])
    new_data.add(n_str)

# 6、将新的 set 集合转换成列表进行排序,取第一个就是最小的
min_n = sorted(list(new_data))[0]
print(min_n)    # 7、输出最小排列组合的值

参考技术B

    用int会越界的,所以先转成str

    数字拼接满足结合律,所以只需要保证每两个数拼接后更小就行了,即ij?ji。因此,可以使用冒泡排序,但是比较的条件变成'i'+'j' > 'j' + 'i',如果满足就交换。

    输出用print(''.join(list))即可,python打印字符串的时候不会带''的。

    代码是:

    # -*- coding:utf-8 -*-

    class Solution:

    def PrintMinNumber(self,numbers):

    if not numbers:

    return ''

    n = len(numbers)

    for i in range(n):

    numbers[i] = str(numbers[i])

    print(numbers)

    for i in range(n):

    for j in range(i+1,n):

    if numbers[i] + numbers[j] > numbers[j] + numbers[i]:

    numbers[i],numbers[j] = numbers[j],numbers[i]

    return ''.join(numbers)

参考技术C

    python中的数组,即使是多维数组,貌似都是用的中括号表示吧? 花括号貌似都是针对字典的。

    个人以为,可以先将原先的数组转换成列表,利用列表的内置方法排序并拼接后,再转换回去原来的格式。

    原始数据,我不知道是什么格式。只是我以为,按照你的说法,跑不出元组、列表、字典等几种格式。这几种格式的转换相对还是比较简单的。

    代码就不写了。个人以为这样的做法,应该比较合适。

以上是关于Python实现,输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接的主要内容,如果未能解决你的问题,请参考以下文章

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字的最小的一个

把数组排成最小的数

把数组排成最小的数

32.把数组排成最小的数(python)

题目1504:把数组排成最小的数

把数组排成最小的数