80. Remove Duplicates from Sorted Array II

简介

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 分别向后转变

你可能感兴趣的:(80. Remove Duplicates from Sorted Array II)