简介
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice?
For example,Given sorted array nums = [1,1,1,2,2,3]
Your function should return length = 5
with the first five elements of nums being 1, 1, 2, 2and 3
It doesn't matter what you leave beyond the new length
总体和26题的思路差不多
代码(python)
class Solution(object):
def if_dp(self):
last1 = yield
last2 = yield False
cur = yield False
while True:
next = yield (last1 == cur == last2)
last1,last2,cur =last2,cur,next
def delete_dup(self,l,p):
i = 0
for j in range(0,len(l)):
if p(l[j]):
continue
l[i] = l[j]
i += 1
return i
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
p = self.if_dp()
next(p)
return self.delete_dup(nums,p.send)
之前的理解上出现了偏差,主要是在send和yield上的理解上
send和yield是两个分开的工作,或者说send在完成next的情况下,自己的
send也有自己的进程
send的例子
def test():
while True:
k = yield
m = yield
if k == 4:
print('aa')
if m == 4:
print('hello')
p = test()
next(p)
p.send(4)
next(p)
我们分析这段代码,当next的时候k被过去了,generator下一次的返回值是 m = yield
这句的yield,send的值传给的是k,而返回的是 m = yield这句,再next的时候
print('aa')
分析代码
1.分别传进nums[0],nums[1],nums[2]给last1,last2,cur,而另一方面
分别返回的是
False : nums[0]
False : nums[1]
此时i = 2 为一个判断点,此时nums[2]传给cur用来返回前三个点是否相同
2.之后的时候nums[3]则直接对应的是返回的是否相同
意思就是说,我传进一个值作为next,然后三个last1,last2,cur 分别向后转变