鱼C论坛

 找回密码
 立即注册
查看: 2674|回复: 55

[已解决]Python:每日一题 284

[复制链接]
发表于 2019-12-4 21:16:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给出一组非负整数,重新排列它们的顺序,把它们组成一个最大的整数

示例 1:

输入:[1, 20, 23, 4, 8]
输出:8423201
示例 2:

输入:[4, 6, 65]
输出:6654


欢迎大家一起答题!
最佳答案
2019-12-4 22:37:01
本帖最后由 Unicorn# 于 2019-12-4 22:38 编辑
def solve(nums):
    class CapStr(str):
        def __lt__(self, value):
            i = j = 0
            while self[i] == value[j]:
                if i < len(self)-1:
                    i += 1
                if j < len(value)-1:
                    j += 1
                if i == len(self)-1 and j == len(value)-1:
                    break
            return self[i] < value[j]
    return int(''.join(sorted(map(lambda x:CapStr(x), nums), reverse=True)))

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-4 21:56:02 | 显示全部楼层
def fun(lst):
    lst.sort(key = lambda x: str(x) + "A", reverse = True)
    return int(''.join(map(str, lst)))
print(fun(lst))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 22:00:00 | 显示全部楼层

如果是[4,6,67]答案应该是6764
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 22:15:33 | 显示全部楼层
fan1993423 发表于 2019-12-4 22:00
如果是[4,6,67]答案应该是6764

是的,我没考虑周全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 22:17:58 | 显示全部楼层
再修改一个:
def fun(lst):
    lst.sort(key = lambda x: str(x) + str(x)[-1], reverse = True)
    return int(''.join(map(str, lst)))
print(fun(lst))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 22:37:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Unicorn# 于 2019-12-4 22:38 编辑
def solve(nums):
    class CapStr(str):
        def __lt__(self, value):
            i = j = 0
            while self[i] == value[j]:
                if i < len(self)-1:
                    i += 1
                if j < len(value)-1:
                    j += 1
                if i == len(self)-1 and j == len(value)-1:
                    break
            return self[i] < value[j]
    return int(''.join(sorted(map(lambda x:CapStr(x), nums), reverse=True)))

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2019-12-4 22:55:35 | 显示全部楼层
我来玩玩,看看有没有我没想到的缺陷。
def solve(nums:list)->int:
    for i in range(len(nums)-1):
        for j in range(i+1,len(nums)):
            a,b = str(nums[i]),str(nums[j])
            if int(a+b) < int(b+a):
                nums[i],nums[j] = nums[j],nums[i]
    #return nums #这是自己调试用的
    res = ''
    for each in nums:
        res += str(each)
    return res

if __name__ == '__main__':
    print('示例1 8423201 输出:',solve([1,20,23,4,8]))
    print('示例1 6654 输出:',solve([4,6,65]))
    print('自测 6664 输出:',solve([66,4,6]))
    print('自测 输出:',solve([21,22,23,24,25,26,22]))
时间复杂度应该是O(n+0.5(n+n^2)) n为列表长度

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 23:16:15 | 显示全部楼层

对于[2,221]得出结果为2212
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 23:16:49 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-4 23:23 编辑


版主大大,这个数据:[262,242,29,282,2822]
试去吧。
我的结果是:
292822822262242
跟我楼上一个道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 23:31:40 | 显示全部楼层
感谢楼上两位的提醒。再次修改:
def fun(lst):
    len1 = len(str(max(lst)))
    lst2 = [(str(x), str(x) + str(x)[-1] * (len1 - len(str(x)))) for x in lst]
    lst2.sort(key = lambda x: x[1], reverse = True)
    return int(''.join(map(lambda x: x[0], lst2)))
print(fun(lst))

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 23:39:32 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-4 23:53 编辑
冬雪雪冬 发表于 2019-12-4 23:31
感谢楼上两位的提醒。再次修改:

我那个数据,输入数据的最后两位交换一下,您这还是错的呢
from 我的 import *
from 冬雪雪冬 import *

lst = [262,242,29,2822,282]
a = fun(lst)
b = solve(lst)
print(b)
print(int(a)-b)
结果:
292822822262242
-540000000
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 00:20:03 | 显示全部楼层
本帖最后由 hrp 于 2019-12-5 18:59 编辑

def func284(testlist):
    list1, list2, list3 = [], [], []
    for i in testlist:
        list1.append(len(str(i)))
    maxlength = max(list1)
    list1.clear()
    for i in testlist:
        list1.append(f'{i:{chr(0)}<{maxlength}}')
    list1.sort(reverse=True)
    for i in list1:
        list2.append(i.replace(chr(0), ''))
    num = len(list2)
    maxnum = 1
    while num:
        maxnum *= num
        num -= 1
    while maxnum:
        list3.append(''.join(str(i) for i in list2))
        for i in range(len(list2) - 1):
            if int(list2[i] + list2[i + 1]) < int(list2[i + 1] + list2[i]):
                list2[i], list2[i + 1] = list2[i + 1], list2[i]
            list3.append(''.join(str(i) for i in list2))
        maxnum -= 1
    return int(max(list3))


#testlist = [1, 20, 23, 4, 8]                   # 8,4,23,20,1
#testlist = [4, 6, 65]                          # 6,65,4
#testlist = [262,242,29,2822,282]               # 29,282,2822,262,242
#testlist = [856, 22, 222, 2221, 2223]          # 856,2223,222,22,2221
testlist = [650, 580, 66, 9, 661, 66105, 59]    # 9,66,661,66105,650,59,580

print(func284(testlist))

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
zltzlt + 2 + 2 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 03:12:25 | 显示全部楼层
冬雪雪冬 发表于 2019-12-4 23:31
感谢楼上两位的提醒。再次修改:

In [9]: def fun(lst):
   ...:     len1 = len(str(max(lst)))
   ...:     lst2 = [(str(x), str(x) + str(x)[-1] * (len1 - len(str(x)))) for x in lst]
   ...:     lst2.sort(key = lambda x: x[1], reverse = True)
   ...:     return int(''.join(map(lambda x: x[0], lst2)))
   ...: print(fun([1,12,123]))                                                                                
123121

答案,不对,我觉的这个题目要用递归做,但递归真的不是我的菜。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 03:25:19 | 显示全部楼层

新版的字符串格式化用的厉害。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 03:39:29 | 显示全部楼层
四点好 发表于 2019-12-5 03:25
新版的字符串格式化用的厉害。

我自己又发现BUG了,重新修改了下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 04:13:50 | 显示全部楼层
hrp 发表于 2019-12-5 03:39
我自己又发现BUG了,重新修改了下

大晚上这么又激情,我稍微想了一下就放弃,本来想递归做,还是你这种补全的方式相对好理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 04:34:55 From FishC Mobile | 显示全部楼层
四点好 发表于 2019-12-5 04:13
大晚上这么又激情,我稍微想了一下就放弃,本来想递归做,还是你这种补全的方式相对好理解。

最近都是昼伏夜出,反正没事做就想一下题
本来我也想做递归的,奈何做不来,就剑走偏锋了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 09:21:49 | 显示全部楼层
本帖最后由 Lamotu 于 2019-12-5 10:32 编辑
def app(num_list):
    '''给出一组非负整数,重新排列它们的顺序,把它们组成一个最大的整数。
'''
    new_list = []
    new_str = ''
    for i in num_list:
        new_list.append(str(i))
    a=sorted(new_list,key=lambda lists: (lists[0],lists[-1]),reverse=True)
    for x in a:
        new_str+=x
    new_num = int(new_str)
    print(new_num)
if __name__ == '__main__':
  a = [1, 20, 23, 4, 8]
  app(a)
  b = [4, 6, 65]
  app(b)
  c = [2,221]
  app(c)

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 09:45:53 | 显示全部楼层
本帖最后由 danteer 于 2019-12-5 10:01 编辑
def func(list1):
    result = ''
    
    def max1(list1):
        temp = list1[0]
        for i in range(1,len(list1)):
            flag = False
            for j in range(min(len(str(temp)),len(str(list1[i])))):
                if str(temp)[j] > str(list1[i])[j]:
                    flag = True
                    break
                elif str(temp)[j] < str(list1[i])[j]:
                    flag = True
                    temp = list1[i]
                    break
                else:
                    pass
            if flag == False:
                if len(str(temp)) == len(str(list1[i])):
                    pass
                else:
                    list2 = list1.copy()
                    if len(str(temp)) > len(str(list1[i])):
                        x = int(str(temp)[len(str(list1[i])):])
                        list2.remove(temp)
                        list2.append(x)
                        temp2 = max1(list2)
                        if temp2 != x:
                            temp = list1[i] 
                    else:
                        x = int(str(list1[i])[len(str(temp)):])
                        list2.remove(list1[i])
                        list2.append(x)
                        temp2 = max1(list2)
                        if temp2 == x:
                            temp = list1[i]
        return temp
    
    while (len(list1)>0):
        temp = max1(list1)
        result += str(temp)
        list1.remove(temp)
    
    return int(result)
用了递归就没法解决稍微大一点的列表了。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 09:50:45 | 显示全部楼层

这函数是一次性的嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-24 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表