首页 > 试题广场 >

最大数

[编程题]最大数
  • 热度指数:38219 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组nums,数组由一些非负整数组成,现需要将他们进行排列并拼接,每个数不可拆分,使得最后的结果最大,返回值需要是string类型,否则可能会溢出。

数据范围:
进阶:时间复杂度 ,空间复杂度:
示例1

输入

[30,1]

输出

"301"
示例2

输入

[2,20,23,4,8]

输出

"8423220"
示例3

输入

[2]

输出

"2"
示例4

输入

[10]

输出

"10"

备注:
输出结果可能非常大,所以你需要返回一个字符串而不是整数。
#
# 最大数
# @param nums int整型一维数组 
# @return string字符串
#
class MySort(str):
    def __lt__(x, y):
        return x+y > y+x
class Solution:
    def solve(self , nums):
        # write code here
        s = [str(n) for n in nums]
        s2 = sorted(s, key=MySort)
        s1 = ''.join(s2)
        if s2[0]=='0':
            return '0'
        return s1


发表于 2021-03-22 20:33:51 回复(2)
额,没想到 [0,0] 这测试用例,用了个 特判。
其他就用 回溯 挨个 比较出 最大的情况, 没想到就 通过了 哈哈。
class Solution:
    def solve(self , nums ):
        # write code here
        self.res = ''
        n = len(nums)
        def dfs(index, path):
            if index == n:
                tmp = "".join(path)
                if tmp > self.res:
                    self.res = tmp
                return
            for i in range(index, n):
                nums[index], nums[i] = nums[i], nums[index]
                path.append(str(nums[index]))
                dfs(index+1, path)
                path.pop()
                nums[index], nums[i] = nums[i], nums[index] 
        dfs(0, [])
        if int(self.res) == 0:
            return '0'
        return self.res


发表于 2021-01-26 16:43:28 回复(0)
#
# 最大数
# @param nums int整型一维数组 
# @return string字符串
#
class Solution:
    def compare(self, nums, i1,i2):
        # 返回 【大, 小】
        str1, str2 = nums[i1], nums[i2]
        for i in range(min(len(str1),len(str2))):
            if str1[i]>str2[i]:
                return
            if str1[i]<str2[i]:
                nums[i1], nums[i2]=str2,str1
                return
        # 1110, 111 应该把111放在1110前面
        # 1112, 111 
        # 走到这一步说明前面i位都相等  如果str1
        i+=1
        if len(str1)>len(str2) and str1[i]<str2[-1]:
            nums[i1], nums[i2]=str2,str1
            return
        if len(str1)<len(str2) and str2[i]>str1[-1]:
            nums[i1], nums[i2]=str2,str1
            return
        
    def solve(self , nums ):
        # write code here
        nums=list(map(str,nums))
        for i in range(len(nums)):
            for j in range(len(nums)-i-1):
                self.compare(nums, j, j+1)
        if nums[0]=="0":
            return "0"
        return "".join(nums)

发表于 2021-01-12 18:50:51 回复(0)
#
# 最大数
# @param nums int整型一维数组 
# @return string字符串
#
class Solution:
    def solve(self , nums ):
        # write code here
        ##第二套#[编程题]题2
        #给定一个数组由一些非负整数组成,现需要将他们进行排列并拼接,使得最后的结果最大,返回值需要是string类型 否则可能会溢出
        s1 = []
        nums = list(map(str,nums))
        for x in nums:
            s1.append(list(x))
        s1.sort(reverse=True)
        i = 0
        while i<len(nums)-1:
            if s1[i][0]==s1[i+1][0] and len(s1[i])>len(s1[i+1]):
                s1[i],s1[i+1] = s1[i+1],s1[i]
                i = -1
            i = i+1
        s2 = ''
        for y in s1:
            s2 = s2+''.join(y)
        if int(s2)==0:
            s2='0'
        return s2
        


编辑于 2020-09-05 23:40:00 回复(0)
# 最终的数据如果从头到尾组合应当符合以下顺序:首先是首数字越大的越靠前,在首字母相同的情况下,长度越短的越靠前,长度也相同的情况下,应当满足值越大的越靠前。
# 根据这一原理,可以根据上面的反序进行排序
# 首先将数据按照从小到大的顺序排序
# 然后将数据按照长短排序
# 最后把数据按照首字母数字排序
class Solution:
    def solve(self , nums ):
        if nums.count(0) == len(nums): return '0'
        else:
            nums.sort(reverse=True)
            nums = list(map(str, nums))
            nums.sort(key=lambda item:len(item))
            nums.sort(reverse=True, key=lambda item:item[0])
            return ''.join(list(map(str, nums)))
发表于 2020-08-20 22:55:18 回复(1)