鱼C论坛

 找回密码
 立即注册
查看: 1863|回复: 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 编辑
  1. def solve(nums):
  2.     class CapStr(str):
  3.         def __lt__(self, value):
  4.             i = j = 0
  5.             while self[i] == value[j]:
  6.                 if i < len(self)-1:
  7.                     i += 1
  8.                 if j < len(value)-1:
  9.                     j += 1
  10.                 if i == len(self)-1 and j == len(value)-1:
  11.                     break
  12.             return self[i] < value[j]
  13.     return int(''.join(sorted(map(lambda x:CapStr(x), nums), reverse=True)))
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2019-12-4 21:56:02 | 显示全部楼层
  1. def fun(lst):
  2.     lst.sort(key = lambda x: str(x) + "A", reverse = True)
  3.     return int(''.join(map(str, lst)))
  4. 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 | 显示全部楼层
再修改一个:
  1. def fun(lst):
  2.     lst.sort(key = lambda x: str(x) + str(x)[-1], reverse = True)
  3.     return int(''.join(map(str, lst)))
  4. print(fun(lst))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-4 22:37:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Unicorn# 于 2019-12-4 22:38 编辑
  1. def solve(nums):
  2.     class CapStr(str):
  3.         def __lt__(self, value):
  4.             i = j = 0
  5.             while self[i] == value[j]:
  6.                 if i < len(self)-1:
  7.                     i += 1
  8.                 if j < len(value)-1:
  9.                     j += 1
  10.                 if i == len(self)-1 and j == len(value)-1:
  11.                     break
  12.             return self[i] < value[j]
  13.     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 | 显示全部楼层
我来玩玩,看看有没有我没想到的缺陷。
  1. def solve(nums:list)->int:
  2.     for i in range(len(nums)-1):
  3.         for j in range(i+1,len(nums)):
  4.             a,b = str(nums[i]),str(nums[j])
  5.             if int(a+b) < int(b+a):
  6.                 nums[i],nums[j] = nums[j],nums[i]
  7.     #return nums #这是自己调试用的
  8.     res = ''
  9.     for each in nums:
  10.         res += str(each)
  11.     return res

  12. if __name__ == '__main__':
  13.     print('示例1 8423201 输出:',solve([1,20,23,4,8]))
  14.     print('示例1 6654 输出:',solve([4,6,65]))
  15.     print('自测 6664 输出:',solve([66,4,6]))
  16.     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 | 显示全部楼层
感谢楼上两位的提醒。再次修改:
  1. def fun(lst):
  2.     len1 = len(str(max(lst)))
  3.     lst2 = [(str(x), str(x) + str(x)[-1] * (len1 - len(str(x)))) for x in lst]
  4.     lst2.sort(key = lambda x: x[1], reverse = True)
  5.     return int(''.join(map(lambda x: x[0], lst2)))
  6. 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
感谢楼上两位的提醒。再次修改:

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

  3. lst = [262,242,29,2822,282]
  4. a = fun(lst)
  5. b = solve(lst)
  6. print(b)
  7. print(int(a)-b)

复制代码

结果:
  1. 292822822262242
  2. -540000000
  3. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

  1. def func284(testlist):
  2.     list1, list2, list3 = [], [], []
  3.     for i in testlist:
  4.         list1.append(len(str(i)))
  5.     maxlength = max(list1)
  6.     list1.clear()
  7.     for i in testlist:
  8.         list1.append(f'{i:{chr(0)}<{maxlength}}')
  9.     list1.sort(reverse=True)
  10.     for i in list1:
  11.         list2.append(i.replace(chr(0), ''))
  12.     num = len(list2)
  13.     maxnum = 1
  14.     while num:
  15.         maxnum *= num
  16.         num -= 1
  17.     while maxnum:
  18.         list3.append(''.join(str(i) for i in list2))
  19.         for i in range(len(list2) - 1):
  20.             if int(list2[i] + list2[i + 1]) < int(list2[i + 1] + list2[i]):
  21.                 list2[i], list2[i + 1] = list2[i + 1], list2[i]
  22.             list3.append(''.join(str(i) for i in list2))
  23.         maxnum -= 1
  24.     return int(max(list3))


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

  30. 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 编辑
  1. def app(num_list):
  2.     '''给出一组非负整数,重新排列它们的顺序,把它们组成一个最大的整数。
  3. '''
  4.     new_list = []
  5.     new_str = ''
  6.     for i in num_list:
  7.         new_list.append(str(i))
  8.     a=sorted(new_list,key=lambda lists: (lists[0],lists[-1]),reverse=True)
  9.     for x in a:
  10.         new_str+=x
  11.     new_num = int(new_str)
  12.     print(new_num)
  13. if __name__ == '__main__':
  14.   a = [1, 20, 23, 4, 8]
  15.   app(a)
  16.   b = [4, 6, 65]
  17.   app(b)
  18.   c = [2,221]
  19.   app(c)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-5 09:45:53 | 显示全部楼层
本帖最后由 danteer 于 2019-12-5 10:01 编辑
  1. def func(list1):
  2.     result = ''
  3.    
  4.     def max1(list1):
  5.         temp = list1[0]
  6.         for i in range(1,len(list1)):
  7.             flag = False
  8.             for j in range(min(len(str(temp)),len(str(list1[i])))):
  9.                 if str(temp)[j] > str(list1[i])[j]:
  10.                     flag = True
  11.                     break
  12.                 elif str(temp)[j] < str(list1[i])[j]:
  13.                     flag = True
  14.                     temp = list1[i]
  15.                     break
  16.                 else:
  17.                     pass
  18.             if flag == False:
  19.                 if len(str(temp)) == len(str(list1[i])):
  20.                     pass
  21.                 else:
  22.                     list2 = list1.copy()
  23.                     if len(str(temp)) > len(str(list1[i])):
  24.                         x = int(str(temp)[len(str(list1[i])):])
  25.                         list2.remove(temp)
  26.                         list2.append(x)
  27.                         temp2 = max1(list2)
  28.                         if temp2 != x:
  29.                             temp = list1[i]
  30.                     else:
  31.                         x = int(str(list1[i])[len(str(temp)):])
  32.                         list2.remove(list1[i])
  33.                         list2.append(x)
  34.                         temp2 = max1(list2)
  35.                         if temp2 == x:
  36.                             temp = list1[i]
  37.         return temp
  38.    
  39.     while (len(list1)>0):
  40.         temp = max1(list1)
  41.         result += str(temp)
  42.         list1.remove(temp)
  43.    
  44.     return int(result)
复制代码

用了递归就没法解决稍微大一点的列表了。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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