鱼C论坛

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

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

[复制链接]
 楼主| 发表于 2020-3-14 17:35:34 | 显示全部楼层
fan1993423 发表于 2020-3-14 15:36
我想了半天,目前只想到删元素这个一开始就有的想法,我个人觉得有更好的办法,看其他鱼油的发挥吧

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:39:44 | 显示全部楼层

输入以下数据超时:

testcase.zip (23.86 KB, 下载次数: 8)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:41:56 | 显示全部楼层
本帖最后由 昵称加载错误 于 2020-3-14 17:50 编辑
def fun351(hand,W):
        a = hand;w = W
        s1,s2 = [],[]
        a.sort()
        c = 0
        while len(a)>=w:
                for i in range(w-1):
                        if a[0] + i in a:
                                c += 1
                        if c == w-1:
                                s3 = a[:]
                                for m in range(w):
                                        s1.append(s3[0] + m)
                                        a.remove(s3[0] + m)
                                c = 0
                                s2.append(list(s1))
                                s1 = []
        if a == []:
                return True
        else:
                return False

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:42:39 | 显示全部楼层
whosyourdaddy 发表于 2020-3-14 16:56
def func351(hand,w):
    if len(hand)%w:
        return False

解答错误

输入:hand = [5, 1], W = 2
输出:True
预期结果:False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-14 17:43:45 | 显示全部楼层

解答错误

输入:hand = [1, 2, 3, 6, 2, 3, 4, 7, 8], W = 3
输出:False
预期结果:True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:52:46 | 显示全部楼层
zltzlt 发表于 2020-3-14 17:43
解答错误

输入:hand = [1, 2, 3, 6, 2, 3, 4, 7, 8], W = 3

对不起啊,在之前的代码中给w赋值了忘删了,对不起
def fun351(hand,W):
        a = hand;w = W
        a.sort()
        c = 0
        while len(a)>=w:
                for i in range(w-1):
                        if a[0] + i in a:
                                c += 1
                        if c == w-1:
                                s3 = a[:]
                                for m in range(w):
                                        a.remove(s3[0] + m)
                                c = 0
        if a == []:
                return True
        else:
                return False

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:54:50 | 显示全部楼层
昵称加载错误 发表于 2020-3-14 17:52
对不起啊,在之前的代码中给w赋值了忘删了,对不起

没关系,不过输入 hand = [1, 2, 3], W = 1 会超时
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:55:01 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-14 18:57 编辑
w = int(input('请输入手牌排列方式(每组牌的数量):'))
print('请输入列表数据,并输入任意非数字结束.')
hand = []
while True:
    data = (input('参数:'))
    if data.isdigit():
        hand.append(int(data))
    else:
        break


def q351(hand, w):
    #判断一:列表中元素不能被完整分段一定为False
    if len(hand)%w != 0:
        return False

    if len(hand) == 1:
        return True

    #将每个元素按照顺序排列,将频数作为每个元素的指纹
    from collections import Counter
    handdic = dict(Counter(hand))

    dict1 = []
    handID1 = []
    for key in handdic:
        dict1.append(key)

    dict1.sort()

    #每个元素出现的频数
    for key in dict1:
        handID1.append(handdic[key])

    handID = handID1

    #当满足判断一后才会运行的判断程序        

    i = 0
    while (i+w) <= len(dict1):
        #判断二:若按顺序分的数组不是相邻元素一次递增1则为False
        if dict1[i:w+i] != [x for x in range(dict1[i], (dict1[i]+w))]:
            return False
        
        test = [x-handID[i:w+i][0] for x in handID[i:w+i]]
        handID = handID[0:i]+test[:]+handID[i+w:]
        #判断三:若按顺序分的数组频数从左到右一次递增或相等,则为False
        if min(test)<0:
            return False
        
        #找到每一列数组中最先不为0的元素并开始重新判断,进入下一个循环
        count = 0
        for each in test:
            if each == 0:
                i += 1                
            else:
                break
                
        continue
    #判断四:当上述情况排除完后,即为True
    return True
    

print(q351(hand, w))

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-14 17:56:06 | 显示全部楼层

输入 hand = [1], W = 1 出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 18:02:32 | 显示全部楼层
def f351(hand,W):
    l=len(hand)
    if l%W:
        return False
    hand.sort()
    while hand:
        b=hand.pop(0)
        for i in range(1,W):
            try:
                hand.remove(b+i)
            except:
                return False
    return True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 18:04:06 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-14 18:27 编辑
zltzlt 发表于 2020-3-14 17:56
输入 hand = [1], W = 1 出错
w = int(input('请输入手牌排列方式(每组牌的数量):'))
print('请输入列表数据,并输入任意非数字结束.')
hand = []
while True:
    data = (input('参数:'))
    if data.isdigit():
        hand.append(int(data))
    else:
        break


def q351(hand, w):
    #判断一:列表中元素不能被完整分段一定为False
    if len(hand)%w != 0:
        return False

    #将每个元素按照顺序排列,将频数作为每个元素的指纹
    from collections import Counter
    handdic = dict(Counter(hand))

    dict1 = []
    handID = []
    for key in handdic:
        dict1.append(key)

    dict1.sort()

    #每个元素出现的频数
    for key in dict1:
        handID.append(handdic[key])

    #当满足判断一后才会运行的判断程序        
    if len[hand] == 1:
        return True
    i = 0
    while (i+w)>= len(dict1):
        #判断二:若按顺序分的数组不是相邻元素一次递增1则为False
        if dict1[i:w+i] != [x for x in range(dict1[i], (dict1[i]+w))]:
            return False
        
        test = [x-handID[i:w+i][0] for x in handID[i:w+i]]
        #判断三:若按顺序分的数组频数从左到右一次递增或相等,则为False
        if min(test)<0:
            return False
        
        #找到每一列数组中最先不为0的元素并开始重新判断,进入下一个循环
        for each in test:
            if each != 0:
                i += test.index(each)
                break
        continue
    #判断四:当上述情况排除完后,即为True
    return True
    

print(q351(hand, w))

第41行忘了添加列表的index,已添加上,但是运行时间超时,不如新增加一个判断条件单独处理元素数量位1的情况


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

使用道具 举报

发表于 2020-3-14 18:04:17 | 显示全部楼层
def func351(hand,w):
    if len(hand)%w:
        return False
    hand.sort()
    for i in range(len(hand)//w):
        maxnumber = max(hand)
        hand.remove(maxnumber)
        try:
            hand.remove(maxnumber-1)
            hand.remove(maxnumber-2)
        except ValueError:
            return False
    return True

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 18:06:57 | 显示全部楼层
def f351(hand,w):
    if len(hand)%w:
        return False
    else:
        hand.sort()
    while True:
        if not hand:
            return True
        for i in range(hand[0],hand[0]+w):
            if i in hand:
                hand.remove(i)
            else:
                return False

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 18:18:56 | 显示全部楼层
本帖最后由 昵称加载错误 于 2020-3-14 18:22 编辑
zltzlt 发表于 2020-3-14 17:54
没关系,不过输入 hand = [1, 2, 3], W = 1 会超时


这回真的改好了
def fun351(hand,W):
        a = hand;w = W
        a.sort()
        c = 0
        while len(a)>=w:
                for i in range(w):
                        if a[0] + i in a:
                                c += 1
                        if c == w:
                                s3 = a[:]
                                for m in range(w):
                                        a.remove(s3[0] + m)
                                c = 0
        if a == []:
                return True
        else:
                return False

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 19:29:05 | 显示全部楼层
def func(hand, W):
        if len(hand) % W:
                return False
        hand.sort()
        for i in range(len(hand) // W):
                x = hand.pop(0)
                print(x)
                for j in range(1, W):
                        x += 1
                        print(x)
                        if x in hand:
                                hand.remove(x)
                        else:
                                return False
        return True

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 19:48:04 | 显示全部楼层    本楼为最佳答案   
zltzlt 发表于 2020-3-14 17:32
解答错误

输入:hand = [1, 2, 3, 4, 5, 6], W = 2
def f(list1,w):
    if len(list1)%w != 0 :
        return False
    else:
        list1.sort()
        while list1:
            a = list1.pop(0)
            try:
                for n in range(1,w):
                    list1.remove(a+n)
            except ValueError:
                return False
        return True
感觉自己脑子里装的都是浆糊

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 20:15:22 | 显示全部楼层
本帖最后由 zylenw97 于 2020-3-14 20:22 编辑
def alice():
    hand = eval(input('请输入hand列表'))
    w = int(input('输入w的值'))
    if len(hand) % w:
        return False
    else:
        num_zu = len(hand) / w
        hand.sort()
        while num_zu:
            b = hand[0]
            try:
                for i in range(w):
                    hand.remove(b + i)
                num_zu -= 1
            except ValueError:
                return False
        else:
            return True
print(alice())

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-14 20:18:54 | 显示全部楼层
本帖最后由 kinkon 于 2020-3-14 20:58 编辑

楼主,优化版在8楼,速度应该不错,可能在100ms内,请测试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 20:24:07 | 显示全部楼层
def f351(hand:list,W:int)->bool:
    if W == 1:
        return True
    elif W > len(hand):
        return False
    elif len(hand)%W != 0:
        return False
    elif W == len(hand) and sorted(hand) == [min(hand)+i for i in range(len(hand))]:
        return True
    else:
        hand1=hand[:]
        a=min(hand1)
        for i in [a+i for i in range(W)]:
            hand1.remove(i)
        return f351(hand1,W)
    
print(f351([1, 2, 3, 6, 2, 3, 4, 7, 8],3))
print(f351([1, 2, 3, 4, 5],4))
print(f351([1, 2, 3, 4, 5,6],2))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-15 00:18:27 | 显示全部楼层
def f351(hand,W):
    x = len(hand)
    if W == 1:
        return True
    if x % W != 0:
        return False
    if (2*sum(hand)) % W!=0:
        return False
    div = x // W
    sorted_arr = sorted(hand)
    for i in range(0,div):
        maxNum  = sorted_arr[-1]
        for index in  range(0,W):
            try:
                position = sorted_arr.index(maxNum-index)
                del sorted_arr[position]
            except Exception:
                return False
    return True
自己综合了一下

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 00:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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