鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

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

[复制链接]
发表于 2019-12-5 11:11:35 | 显示全部楼层
阴阳神万物主 发表于 2019-12-4 22:55
我来玩玩,看看有没有我没想到的缺陷。
时间复杂度应该是O(n+0.5(n+n^2)) n为列表长度

大O写法的话直接写成O(n^2)就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 12:06:31 | 显示全部楼层
danteer 发表于 2019-12-5 11:11
大O写法的话直接写成O(n^2)就行了

哦是这样啊,我这接触不深
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 12:29:53 From FishC Mobile | 显示全部楼层
danteer 发表于 2019-12-5 09:50
这函数是一次性的嘛

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

使用道具 举报

发表于 2019-12-5 14:29:40 | 显示全部楼层
hrp 发表于 2019-12-5 12:29
为什么这么说呢

我运行第一次能用,再运行第二次就报错了啊。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 14:39:50 | 显示全部楼层
danteer 发表于 2019-12-5 14:29
我运行第一次能用,再运行第二次就报错了啊。。。。。

我运行没问题,py3.8

能告诉我运行哪个列表报错了么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 15:06:58 | 显示全部楼层
#每日一题文档,旨在练习Pyhon熟练度和提高算法

def fun284(list_Num = [1,2,3],n = 10):
    #n不能小于数组中元素位数最长的值
    '''日期20191204
原文链接:https://fishc.com.cn/forum.php?mod=viewthread&tid=151816&highlight=%C3%BF%C8%D5%D2%BB%CC%E2
今天的题目:
给出一组非负整数,重新排列它们的顺序,把它们组成一个最大的整数。

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

示例 2:
输入:[4, 6, 65]
输出:6654
'''
#该问题只要判断出每个元素的‘大小就可以’
#比较方法是比较最左边的大小,如果相同切有下一位则比较下一位
#该方法比较大小可以通过转换为同一次级10**n,如65和6则转换为65和60
    def buquan(num,len_num = n):
    #将所有整数通过末尾加 原来末尾的最后一位 转换为长度相同的整数
        while num <10**n-1:
            num  = num * 10 +num%10
        return num

    s = ''
    list_Num.sort(key = buquan ,reverse = True)#将数字变为字符串降序
    for i in  list_Num:
        s += str(i)
    return int(s)

                                            
print('输入为:[1,20,23,4,8]\t输出最大整数为:%d'             %(fun284(list_Num = [1,20,23,4,8])) )
print('输入为:[4,6,65]\t输出最大整数为:%d'                  %(fun284(list_Num = [4,6,65])) )
print('输入为:[262,242,29,282,2822]\t输出最大整数为:%d'     %(fun284(list_Num = [262,242,29,282,2822])) )
print('输入为:[650, 580, 66, 9, 661, 59]\t输出最大整数为:%d'%(fun284(list_Num = [650, 580, 66, 9, 661, 59])) )
print('输入为:[2,221]\t输出最大整数为:%d'                   %(fun284(list_Num = [2,221])) )
print('输入为:[4,6,67]\t输出最大整数为:%d'                  %(fun284(list_Num = [4,6,67])) )

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-5 15:09:30 | 显示全部楼层
原文看起来好长,发个短的
#每日一题文档,旨在练习Pyhon熟练度和提高算法

def fun284(list_Num = [1,2,3],n = 10):
    #n不能小于数组中元素位数最长的值
    def buquan(num,len_num = n):
    #将所有整数通过末尾加 原来末尾的最后一位 转换为长度相同的整数
        while num <10**n-1:
            num  = num * 10 +num%10
        return num

    s = ''
    list_Num.sort(key = buquan ,reverse = True)#将数字变为字符串降序
    for i in  list_Num:
        s += str(i)
    return int(s)

                                            
print('输入为:[1,20,23,4,8]\t输出最大整数为:%d'             %(fun284(list_Num = [1,20,23,4,8])) )
print('输入为:[4,6,65]\t输出最大整数为:%d'                  %(fun284(list_Num = [4,6,65])) )
print('输入为:[262,242,29,282,2822]\t输出最大整数为:%d'     %(fun284(list_Num = [262,242,29,282,2822])) )
print('输入为:[650, 580, 66, 9, 661, 59]\t输出最大整数为:%d'%(fun284(list_Num = [650, 580, 66, 9, 661, 59])) )
print('输入为:[2,221]\t输出最大整数为:%d'                   %(fun284(list_Num = [2,221])) )
print('输入为:[4,6,67]\t输出最大整数为:%d'                  %(fun284(list_Num = [4,6,67])) )

>>> 
==================== RESTART: C:\Users\13555\Desktop\1.py ====================
输入为:[1,20,23,4,8]        输出最大整数为:8423201
输入为:[4,6,65]        输出最大整数为:6654
输入为:[262,242,29,282,2822]        输出最大整数为:292822822262242
输入为:[650, 580, 66, 9, 661, 59]        输出最大整数为:66661650595809
输入为:[2,221]        输出最大整数为:2221
输入为:[4,6,67]        输出最大整数为:6764
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 15:24:38 | 显示全部楼层
hrp 发表于 2019-12-5 14:39
我运行没问题,py3.8

能告诉我运行哪个列表报错了么

就像这样
12_5.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 15:41:50 | 显示全部楼层
本帖最后由 sn8625 于 2019-12-5 16:13 编辑
'''
给出一组非负整数,重新排列它们的顺序,把它们组成一个最大的整数
输入:[1, 20, 23, 4, 8]
输出:8423201

输入:[4, 6, 65]
输出:6654
'''
def number():
    l = [1, 20, 23, 4, 8]
    nl = len(l)
    lr = []
    if nl == 1:
        return l[0]

    ln = [str(i) for i in l]
    ln.sort(reverse=True)

    for i in range(nl):
        for j in range(nl):
            lt = ln.copy()
            s = lt.pop(i)
            lt.insert(j,s)
            lr.append(int(''.join(lt)))
            # print(lr)
    return max(lr)

f = number()
print(f)

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-5 16:37:39 | 显示全部楼层
from itertools import permutations

def fun284(x):
    list_x = []
    for i in permutations(x):
        list_x.append(int(''.join([str(j) for j in i])))
    return max(list_x)

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-5 16:46:05 | 显示全部楼层

我知道原因了,因为你的测试方法测试完没有退出程序,导致列表没清空,而我刚好复用list2了(其实不复用也会出现不可预知的结果),第二次测试就直接追加数据进去,就报错了。我吧list2 list3 result 都移到函数里面,每次运行都清空,就OK了,这是个小坑,多谢提醒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-5 18:21:45 | 显示全部楼层
def fun(lst):
    lst.sort(key = lambda x: str(x), reverse = True)
    return int(''.join(map(str, lst)))

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-5 20:06:37 | 显示全部楼层
以上例子均测试无误
import itertools

result = []
compare_list = []
int_list = [262,242,29,282,2822]
str_list = []
for member in int_list:
    str_list.append(str(member))
for member_list in itertools.permutations(str_list):
    list1 = member_list[:]
    for i in list1:
        for j in i:
            compare_list.append(str(j))
    if result < compare_list:
        result,compare_list = compare_list,result
    compare_list = []
for i in result:
    for j in i:
        print(j,end = '')

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-5 20:15:02 | 显示全部楼层
18463102026 发表于 2019-12-5 15:09
原文看起来好长,发个短的

这行结果不对啊
输入为:[650, 580, 66, 9, 661, 59]        输出最大整数为:66661650595809
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 20:46:32 | 显示全部楼层

恭喜通过!

执行用时:101 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 20:47:18 | 显示全部楼层
本帖最后由 zltzlt 于 2019-12-5 21:02 编辑
阴阳神万物主 发表于 2019-12-4 22:55
我来玩玩,看看有没有我没想到的缺陷。
时间复杂度应该是O(n+0.5(n+n^2)) n为列表长度


解答错误

输入:[0,0]
输出:"00"
预期结果:0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

恭喜通过!

执行用时:101 ms
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 20:50:19 | 显示全部楼层

输入 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] 超时(结果应是 9876543210)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 20:53:00 | 显示全部楼层

解答错误

输入:[3577,9155,9352,7911,1622]
输出:91559352791135771622
预期结果:93529155791135771622
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-5 20:54:31 | 显示全部楼层
danteer 发表于 2019-12-5 09:45
用了递归就没法解决稍微大一点的列表了。。。。。。

输入 [25,5,12,97,3,8,79,73,38,88,98,29,84,74,16,2,67,65,41,44,88,75,51,87,95,90,45,40,7,53,5,30,77,5,56,58,41,51,62,88,33,69,81,78,18,63,82,90,21,6,12,92,67,6,81,83,14,6,76,85,79,96,41,44,20,89,59,58,83,58,73,1,41,41,24,55,61,49,10,42,5,1,98,30,91,9,34,5,84,43,73,4,22,11,21,14,1,62,77,41] 超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-24 17:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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