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

题目:输入一个正数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321... 题目:输入一个正数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{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函数对于所有的可迭代序列都可以定义,我将下面代码做了修改,请帮忙看下是否正确,谢谢!
展开
 我来答
百度网友1785ee410
2018-01-21 · TA获得超过570个赞
知道小有建树答主
回答量:782
采纳率:80%
帮助的人:180万
展开全部

你的例子第一列全是 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

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

crazy_cong
2018-01-21 · 超过19用户采纳过TA的回答
知道答主
回答量:71
采纳率:50%
帮助的人:16.8万
展开全部
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、输出最小排列组合的值
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
huofeng_1994
2019-03-14 · TA获得超过304个赞
知道答主
回答量:9
采纳率:0%
帮助的人:3471
展开全部
  1. 用int会越界的,所以先转成str

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

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

  4. 代码是:

  5. # -*- coding:utf-8 -*-

  6. class Solution:

  7. def PrintMinNumber(self,numbers):

  8. if not numbers:

  9. return ''

  10. n = len(numbers)

  11. for i in range(n):

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

  13. print(numbers)

  14. for i in range(n):

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

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

  17. numbers[i],numbers[j] = numbers[j],numbers[i]

  18. return ''.join(numbers)

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lmw0320
2019-02-17
知道答主
回答量:13
采纳率:0%
帮助的人:4.4万
展开全部
  1. python中的数组,即使是多维数组,貌似都是用的中括号表示吧? 花括号貌似都是针对字典的。

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

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

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

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式