对于使用贪心算法的一个比较经典的问题,主要是为了解决最大整数的拼接问题,如果给定一个列表,这个列表中所包括的是一些非负整数,如果对这些整数进行组合,怎样才能组合出一个最大的整数,这里要注意一个问题,有可能整数过大会导致出现溢出的现象,所以返回的数据可以是一个字符类型,这样就可以防止溢出。

python如何取到最近的一个整数_数据

添加图片注释,不超过 140 字(可选)

对如上的一个给定列表中的数据进行排列,这里如果考虑将本身值较大的放在前面的话,就不会得到拼接后较大的值,因为12112并没有12121数值大,所以正确的解决问题的思路是通过拼接两个字符,对比确定那个位于前面的时候才能够得到较大的整数。

python如何取到最近的一个整数_开发语言_02

添加图片注释,不超过 140 字(可选)

再例如,如果给定的另外一个列表如上图,就在决定两个元素如何拼接时,不能简单通过两个元素大小进行判断,将两个元素不同拼接方式所组成的数字的大小进行拼接后对比,这里使用的是双层循环,对数组中的遍历,每两个元素进行组合,每次循环分别确定最终拼接的第1位一直到最后一位,然后将元素按照顺序拼接起来返回即可。

python如何取到最近的一个整数_开发语言_03

添加图片注释,不超过 140 字(可选)

双层循环遍历数组中两两元素的组合方式,每次循环确定一个位置的元素,经过排序这个列表中元素的顺序得到最终结果,这里要注意一个特殊情况,当列表中元素均为0时,最终返回的结果是多个0,这里要将其转换一个元素0。使用python实现的代码如下:

def largestNumber(nums):
    nums=[str(i) for i in nums]
    for i in range(len(nums)-1):
        for j in range(i+1,len(nums)):
            if int(nums[i]+nums[j])<int(nums[j]+nums[i]):
                temp=nums[i]
                nums[i]=nums[j]
                nums[j]=temp
    if int(''.join(nums))==0:
        return str(0)
    else:
        return ''.join(nums)

对如上的一个代码还可以进行优化:

from functools import cmp_to_key 
def largestNumber(nums):
    nums=[str(i) for i in nums]
    nums.sort(key=cmp_to_key(lambda x,y:int(y+x)-int(x+y)))
    if int(''.join(nums))==0:
        return '0'
    else: 
        return ''.join(nums)