|
发表于 2020-3-17 20:55:35
|
显示全部楼层
- ===============================================================================
- 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:
- i += 1
- if each != 0:
- continue
-
- #判断四:当上述情况排除完后,若所有元素全部为0即为True,否则为False.
- if len(set(handID)) == 1:
- return True
- return False
- print(q351(hand1, w1))
- print(q351(hand2, w2))
- ===============================================================================
- def f(hand, w):
- if len(hand)%w != 0:
- return False
- process = hand[:]
- while process != []:
- for each in range(min(process), min(process)+w):
- try:
- process.remove(each)
- except ValueError:
- return False
-
- return True
-
- print(f(hand1, w1))
- print(f(hand2, w2))
- ===============================================================================
复制代码
最后,感谢版主的支持!!!
|
|