鱼C论坛

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

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

[复制链接]
 楼主| 发表于 2020-3-14 17:39:44 | 显示全部楼层

输入以下数据超时:

testcase.zip (23.86 KB, 下载次数: 8)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 17:41:56 | 显示全部楼层
本帖最后由 昵称加载错误 于 2020-3-14 17:50 编辑
  1. def fun351(hand,W):
  2.         a = hand;w = W
  3.         s1,s2 = [],[]
  4.         a.sort()
  5.         c = 0
  6.         while len(a)>=w:
  7.                 for i in range(w-1):
  8.                         if a[0] + i in a:
  9.                                 c += 1
  10.                         if c == w-1:
  11.                                 s3 = a[:]
  12.                                 for m in range(w):
  13.                                         s1.append(s3[0] + m)
  14.                                         a.remove(s3[0] + m)
  15.                                 c = 0
  16.                                 s2.append(list(s1))
  17.                                 s1 = []
  18.         if a == []:
  19.                 return True
  20.         else:
  21.                 return False
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

解答错误

输入:hand = [1, 2, 3, 6, 2, 3, 4, 7, 8], W = 3
输出:False
预期结果:True
小甲鱼最新课程 -> https://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赋值了忘删了,对不起
  1. def fun351(hand,W):
  2.         a = hand;w = W
  3.         a.sort()
  4.         c = 0
  5.         while len(a)>=w:
  6.                 for i in range(w-1):
  7.                         if a[0] + i in a:
  8.                                 c += 1
  9.                         if c == w-1:
  10.                                 s3 = a[:]
  11.                                 for m in range(w):
  12.                                         a.remove(s3[0] + m)
  13.                                 c = 0
  14.         if a == []:
  15.                 return True
  16.         else:
  17.                 return False
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

没关系,不过输入 hand = [1, 2, 3], W = 1 会超时
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  14.     if len(hand) == 1:
  15.         return True

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

  19.     dict1 = []
  20.     handID1 = []
  21.     for key in handdic:
  22.         dict1.append(key)

  23.     dict1.sort()

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

  27.     handID = handID1

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

  29.     i = 0
  30.     while (i+w) <= len(dict1):
  31.         #判断二:若按顺序分的数组不是相邻元素一次递增1则为False
  32.         if dict1[i:w+i] != [x for x in range(dict1[i], (dict1[i]+w))]:
  33.             return False
  34.         
  35.         test = [x-handID[i:w+i][0] for x in handID[i:w+i]]
  36.         handID = handID[0:i]+test[:]+handID[i+w:]
  37.         #判断三:若按顺序分的数组频数从左到右一次递增或相等,则为False
  38.         if min(test)<0:
  39.             return False
  40.         
  41.         #找到每一列数组中最先不为0的元素并开始重新判断,进入下一个循环
  42.         count = 0
  43.         for each in test:
  44.             if each == 0:
  45.                 i += 1               
  46.             else:
  47.                 break
  48.                
  49.         continue
  50.     #判断四:当上述情况排除完后,即为True
  51.     return True
  52.    

  53. print(q351(hand, w))
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

输入 hand = [1], W = 1 出错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 18:02:32 | 显示全部楼层
  1. def f351(hand,W):
  2.     l=len(hand)
  3.     if l%W:
  4.         return False
  5.     hand.sort()
  6.     while hand:
  7.         b=hand.pop(0)
  8.         for i in range(1,W):
  9.             try:
  10.                 hand.remove(b+i)
  11.             except:
  12.                 return False
  13.     return True
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

  17.     dict1 = []
  18.     handID = []
  19.     for key in handdic:
  20.         dict1.append(key)

  21.     dict1.sort()

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

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

  48. print(q351(hand, w))
复制代码

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


小甲鱼最新课程 -> https://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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 18:06:57 | 显示全部楼层
  1. def f351(hand,w):
  2.     if len(hand)%w:
  3.         return False
  4.     else:
  5.         hand.sort()
  6.     while True:
  7.         if not hand:
  8.             return True
  9.         for i in range(hand[0],hand[0]+w):
  10.             if i in hand:
  11.                 hand.remove(i)
  12.             else:
  13.                 return False
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://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 会超时


这回真的改好了
  1. def fun351(hand,W):
  2.         a = hand;w = W
  3.         a.sort()
  4.         c = 0
  5.         while len(a)>=w:
  6.                 for i in range(w):
  7.                         if a[0] + i in a:
  8.                                 c += 1
  9.                         if c == w:
  10.                                 s3 = a[:]
  11.                                 for m in range(w):
  12.                                         a.remove(s3[0] + m)
  13.                                 c = 0
  14.         if a == []:
  15.                 return True
  16.         else:
  17.                 return False
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 19:29:05 | 显示全部楼层
  1. def func(hand, W):
  2.         if len(hand) % W:
  3.                 return False
  4.         hand.sort()
  5.         for i in range(len(hand) // W):
  6.                 x = hand.pop(0)
  7.                 print(x)
  8.                 for j in range(1, W):
  9.                         x += 1
  10.                         print(x)
  11.                         if x in hand:
  12.                                 hand.remove(x)
  13.                         else:
  14.                                 return False
  15.         return True
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-14 20:15:22 | 显示全部楼层
本帖最后由 zylenw97 于 2020-3-14 20:22 编辑
  1. def alice():
  2.     hand = eval(input('请输入hand列表'))
  3.     w = int(input('输入w的值'))
  4.     if len(hand) % w:
  5.         return False
  6.     else:
  7.         num_zu = len(hand) / w
  8.         hand.sort()
  9.         while num_zu:
  10.             b = hand[0]
  11.             try:
  12.                 for i in range(w):
  13.                     hand.remove(b + i)
  14.                 num_zu -= 1
  15.             except ValueError:
  16.                 return False
  17.         else:
  18.             return True
  19. print(alice())
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

楼主,优化版在8楼,速度应该不错,可能在100ms内,请测试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 00:18:27 | 显示全部楼层
  1. def f351(hand,W):
  2.     x = len(hand)
  3.     if W == 1:
  4.         return True
  5.     if x % W != 0:
  6.         return False
  7.     if (2*sum(hand)) % W!=0:
  8.         return False
  9.     div = x // W
  10.     sorted_arr = sorted(hand)
  11.     for i in range(0,div):
  12.         maxNum  = sorted_arr[-1]
  13.         for index in  range(0,W):
  14.             try:
  15.                 position = sorted_arr.index(maxNum-index)
  16.                 del sorted_arr[position]
  17.             except Exception:
  18.                 return False
  19.     return True
复制代码

自己综合了一下

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 13:07:54 | 显示全部楼层
难度评级: 简单
要素分析: 排序 分组
代码:
  1. def solve(hand:list,W:int)->bool:
  2.     data = dict()
  3.     for each in set(hand):data[each]=hand.count(each)
  4.     print(data)
  5.     for item in sorted(data.keys()):
  6.         if data[item] == 0:
  7.             continue
  8.         i = data[item]
  9.         for x in range(item,item+W):
  10.             if x in data and data[x]>=i:
  11.                 data[x] -= i
  12.             else:
  13.                 return False
  14.     return True

  15. if __name__ == '__main__':
  16.     print('示例1 输出:',solve(hand = [1, 2, 3, 6, 2, 3, 4, 7, 8], W = 3))
  17.     print('示例2 输出:',solve(hand = [1, 2, 3, 4, 5], W = 4))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-14 13:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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