如果把这道题看成一个模拟的话
代码还是很长的
由于蒟蒻只会模拟
于是乎
一个神奇的
模拟伪代码(伪到极致)出现了:
class Solution: def IsContinuous(self,numbers): # ① 求0的个数 # ② 求列表中有没有重复的数 # ③ 算出列表遍历的起始位置和结束位置 # ④ 求出共有多少位置需要填0 # ⑤ 看0的个数够不够填充
盲猜一手 30 行(记住这句话)
正正文
模拟嘛
不难理解
跟着思路走一遍就有了
① 求 0 的个数
遍历一遍列表
zero=0 for i in numbers: if i==0: zero+=1非常简单
② 求列表中有没有重复的数
首先需要把 0 去掉
因为 0 有可能重复(但 0 重复并没有错)
#这里先逆序排下序方便pop numbers.sort() numbers=numbers[::-1] for i in range(zero): numbers.pop()
现在这个列表就是一个逆序没有 0 的列表了
原列表长度和集合去重后长度比较一下就可以了
length=len(numbers) length2=len(set(numbers)) if length!=length2: return False
③ 算出列表遍历的起始位置和结束位置
这是为了方便后面求填 0 的个数
遍历标记一下
在此之前需要一个桶标记一下存在的数
1)
就是第一个遇见 1 的位置
2)
就是遇见 1 的个数等于去 0 后列表长度时候的位置
思路很明确,代码很难写
#这是个桶 t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0] begin=0 end=0 for i in numbers: t[i]+=1 #当前遍历位置 pos=0 #当前遍历到为1的个数 nums=0 for i in t: if i!=0: if begin==0: begin=pos nums+=1 if nums==length and end==0: end=pos pos+=1
④ + ⑤ 求出共有多少位置需要填 0 + 看 0 的个数够不够填充
这个不难
计数+比较
#找空位 z=0 for i in t[begin:end+1]: if i==0: z+=1 if z>zero: return False else: return True
模拟基本就完成了
总代码就是这样
class Solution: def IsContinuous(self,numbers): zero=0 numbers.sort() numbers=numbers[::-1] for i in numbers: if i==0: zero+=1 for i in range(zero): numbers.pop() length=len(numbers) length2=len(set(numbers)) if length!=length2: return False t=[0,0,0,0,0,0,0,0,0,0,0,0,0,0] begin=0 end=0 for i in numbers: t[i]+=1 pos=0 nums=0 for i in t: if i!=0: if begin==0: begin=pos nums+=1 if nums==length and end==0: end=pos pos+=1 z=0 for i in t[begin:end+1]: if i==0: z+=1 if z>zero: return False else: return Truemmp 这40来行