zltzlt 发表于 2019-12-4 21:16:29

Python:每日一题 284

今天的题目:

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

示例 1:

输入:
输出:8423201
示例 2:

输入:
输出:6654

{:10_298:}欢迎大家一起答题!{:10_298:}

冬雪雪冬 发表于 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))

fan1993423 发表于 2019-12-4 22:00:00

冬雪雪冬 发表于 2019-12-4 21:56


如果是答案应该是6764

冬雪雪冬 发表于 2019-12-4 22:15:33

fan1993423 发表于 2019-12-4 22:00
如果是答案应该是6764

是的,我没考虑周全

冬雪雪冬 发表于 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))

Unicorn# 发表于 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 == value:
                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 < value
    return int(''.join(sorted(map(lambda x:CapStr(x), nums), reverse=True)))

阴阳神万物主 发表于 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),str(nums)
            if int(a+b) < int(b+a):
                nums,nums = nums,nums
    #return nums #这是自己调试用的
    res = ''
    for each in nums:
      res += str(each)
    return res

if __name__ == '__main__':
    print('示例1 8423201 输出:',solve())
    print('示例1 6654 输出:',solve())
    print('自测 6664 输出:',solve())
    print('自测 输出:',solve())
时间复杂度应该是O(n+0.5(n+n^2)) n为列表长度

_谪仙 发表于 2019-12-4 23:16:15

冬雪雪冬 发表于 2019-12-4 22:17
再修改一个:

对于得出结果为2212

阴阳神万物主 发表于 2019-12-4 23:16:49

本帖最后由 阴阳神万物主 于 2019-12-4 23:23 编辑

冬雪雪冬 发表于 2019-12-4 22:17
再修改一个:

版主大大,这个数据:
试去吧。
我的结果是:
292822822262242
跟我楼上一个道理

冬雪雪冬 发表于 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, reverse = True)
    return int(''.join(map(lambda x: x, lst2)))
print(fun(lst))

阴阳神万物主 发表于 2019-12-4 23:39:32

本帖最后由 阴阳神万物主 于 2019-12-4 23:53 编辑

冬雪雪冬 发表于 2019-12-4 23:31
感谢楼上两位的提醒。再次修改:
我那个数据,输入数据的最后两位交换一下,您这还是错的呢
from 我的 import *
from 冬雪雪冬 import *

lst =
a = fun(lst)
b = solve(lst)
print(b)
print(int(a)-b)


结果:
292822822262242
-540000000
>>>

hrp 发表于 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 + list2) < int(list2 + list2):
                list2, list2 = list2, list2
            list3.append(''.join(str(i) for i in list2))
      maxnum -= 1
    return int(max(list3))


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

print(func284(testlist))

四点好 发表于 2019-12-5 03:12:25

冬雪雪冬 发表于 2019-12-4 23:31
感谢楼上两位的提醒。再次修改:

In : 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, reverse = True)
   ...:   return int(''.join(map(lambda x: x, lst2)))
   ...: print(fun())                                                                              
123121

答案,不对,我觉的这个题目要用递归做,但递归真的不是我的菜。

四点好 发表于 2019-12-5 03:25:19

hrp 发表于 2019-12-5 00:20


新版的字符串格式化用的厉害。

hrp 发表于 2019-12-5 03:39:29

四点好 发表于 2019-12-5 03:25
新版的字符串格式化用的厉害。

我自己又发现BUG了,重新修改了下

四点好 发表于 2019-12-5 04:13:50

hrp 发表于 2019-12-5 03:39
我自己又发现BUG了,重新修改了下

大晚上这么又激情,我稍微想了一下就放弃,本来想递归做,还是你这种补全的方式相对好理解。

hrp 发表于 2019-12-5 04:34:55

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

最近都是昼伏夜出,反正没事做就想一下题{:10_247:}
本来我也想做递归的,奈何做不来,就剑走偏锋了{:10_245:}

Lamotu 发表于 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,lists[-1]),reverse=True)
    for x in a:
      new_str+=x
    new_num = int(new_str)
    print(new_num)
if __name__ == '__main__':
a =
app(a)
b =
app(b)
c =
app(c)

danteer 发表于 2019-12-5 09:45:53

本帖最后由 danteer 于 2019-12-5 10:01 编辑

def func(list1):
    result = ''
   
    def max1(list1):
      temp = list1
      for i in range(1,len(list1)):
            flag = False
            for j in range(min(len(str(temp)),len(str(list1)))):
                if str(temp) > str(list1):
                  flag = True
                  break
                elif str(temp) < str(list1):
                  flag = True
                  temp = list1
                  break
                else:
                  pass
            if flag == False:
                if len(str(temp)) == len(str(list1)):
                  pass
                else:
                  list2 = list1.copy()
                  if len(str(temp)) > len(str(list1)):
                        x = int(str(temp))):])
                        list2.remove(temp)
                        list2.append(x)
                        temp2 = max1(list2)
                        if temp2 != x:
                            temp = list1
                  else:
                        x = int(str(list1))
                        list2.remove(list1)
                        list2.append(x)
                        temp2 = max1(list2)
                        if temp2 == x:
                            temp = list1
      return temp
   
    while (len(list1)>0):
      temp = max1(list1)
      result += str(temp)
      list1.remove(temp)
   
    return int(result)
用了递归就没法解决稍微大一点的列表了。。。。。。

danteer 发表于 2019-12-5 09:50:45

hrp 发表于 2019-12-5 00:20


这函数是一次性的嘛{:10_277:}
页: [1] 2 3
查看完整版本: Python:每日一题 284