📌  相关文章
📜  Python程序排列给定的数字以形成最大的数字

📅  最后修改于: 2022-05-13 01:55:46.912000             🧑  作者: Mango

Python程序排列给定的数字以形成最大的数字

给定一组数字,以产生最大值的方式排列它们。例如,如果给定数字是 {54, 546, 548, 60},则排列 6054854654 给出最大值。如果给定的数字是 {1, 34, 3, 98, 9, 76, 45, 4},则排列 998764543431 给出最大值。

我们想到的一个简单的解决方案是按降序对所有数字进行排序,但简单的排序是行不通的。例如,548 大于 60,但在输出中 60 在 548 之前。作为第二个示例,98 大于 9,但在输出中 9 在 98 之前。

那么我们该怎么做呢?这个想法是使用任何基于比较的排序算法。
在使用的排序算法中,不使用默认比较,而是编写一个比较函数myCompare()并使用它对数字进行排序。

给定两个数字XYmyCompare()应该如何决定首先放置哪个数字 - 我们比较两个数字 XY(Y 附加在 X 的末尾)和 YX(X 附加在 Y 的末尾)。如果XY较大,则 X 应该在输出中出现在 Y 之前,否则 Y 应该在之前。例如,让 X 和 Y 为 542 和 60。为了比较 X 和 Y,我们比较 54260 和 60542。由于 60542 大于 54260,我们将 Y 放在首位。

以下是上述方法的实现。
为了保持代码简单,数字被视为字符串,使用向量而不是普通数组。

下面是上述方法的实现:

Python3
# Python3 Program to get the maximum
# possible integer from given array
# of integers...
  
  
# Custom comparator to sort according
# to the ab, ba as mentioned in description
def comparator(a, b):
    ab = str(a) + str(b)
    ba = str(b) + str(a)
    return ((int(ba) & gt
             int(ab)) -
            (int(ba) & lt
             int(ab)))
  
def myCompare(mycmp):
  
    # Convert a cmp= function into a 
    # key= function
    class K(object):
        def __init__(self, obj, *args):
            self.obj = obj
  
        def __lt__(self, other):
            return mycmp(self.obj, other.obj) & 
                   lt 0
  
        def __gt__(self, other):
            return mycmp(self.obj, other.obj) & 
                   gt 0
  
        def __eq__(self, other):
            return mycmp(self.obj, other.obj) == 0
  
        def __le__(self, other):
            return mycmp(self.obj, other.obj) & 
                   lt = 0
  
        def __ge__(self, other):
            return mycmp(self.obj, other.obj) & 
                   gt = 0
  
        def __ne__(self, other):
            return mycmp(self.obj, other.obj) != 0
    return K
  
  
# Driver code
if __name__ == "__main__":
    a = [54, 546, 548, 60]
    sorted_array = sorted(a, key = 
                   myCompare(comparator))
    number = "".join([str(i) for i in sorted_array])
    print(number)
  
# This code is Contributed by SaurabhTewary


Python3
# Python3 implementation this is to 
# use itertools. permutations as 
# coded below:
  
from itertools import permutations
def largest(l):
    lst = []
    for i in permutations(l, len(l)):
  
        # Provides all permutations of the 
        # list values, store them in list to 
        # find max
        lst.append("".join(map(str,i))) 
    return max(lst)
  
print(largest([54, 546, 548, 60])) 
# This code is contributed by Raman Monga


输出:

6054854654

时间复杂度: O(nlogn) ,排序被认为具有 O(nlogn) 的运行时间复杂度,并且 for 循环在 O(n) 时间内运行。
辅助空间: O(1)。

另一种方法:(使用itertools)

使用Python的内置库,可以使用 itertools 库来执行此任务。

Python3

# Python3 implementation this is to 
# use itertools. permutations as 
# coded below:
  
from itertools import permutations
def largest(l):
    lst = []
    for i in permutations(l, len(l)):
  
        # Provides all permutations of the 
        # list values, store them in list to 
        # find max
        lst.append("".join(map(str,i))) 
    return max(lst)
  
print(largest([54, 546, 548, 60])) 
# This code is contributed by Raman Monga

输出:

6054854654

时间复杂度: O(nlogn)
辅助空间: O(1)。

请参阅完整的文章排列给定的数字形成最大的数字 |设置 1 了解更多详情!