LeetCode-Python-281. 锯齿迭代器

648 篇文章 23 订阅

给出两个一维的向量,请你实现一个迭代器,交替返回它们中间的元素。

示例:

输入:
v1 = [1,2]
v2 = [3,4,5,6] 

输出: [1,3,2,4,5,6]

解析: 通过连续调用 next 函数直到 hasNext 函数返回 false,
     next 函数返回值的次序应依次为: [1,3,2,4,5,6]。

拓展:假如给你 k 个一维向量呢?你的代码在这种情况下的扩展性又会如何呢?

拓展声明:
 “锯齿” 顺序对于 k > 2 的情况定义可能会有些歧义。所以,假如你觉得 “锯齿” 这个表述不妥,也可以认为这是一种 “循环”。例如:

输入:
[1,2,3]
[4,5,6,7]
[8,9]

输出: [1,4,8,2,5,9,3,6,7].

第一种思路:

在init里就把两个list合并好。

class ZigzagIterator(object):

    def __init__(self, v1, v2):
        """
        Initialize your data structure here.
        :type v1: List[int]
        :type v2: List[int]
        """
        self.list = []
        if v1 and v2:
            i = 0
            for i in range(min(len(v1), len(v2))):
                self.list.append(v1[i])
                self.list.append(v2[i])
            if v1[i + 1:]:
                self.list += v1[i + 1:]
            else:
                self.list += v2[i + 1:]
            
        elif v1:
            self.list = v1
        else:
            self.list = v2
        self.index = 0
    def next(self):
        """
        :rtype: int
        """
        self.index += 1
        return self.list[self.index - 1]

    def hasNext(self):
        """
        :rtype: bool
        """
        return self.index != len(self.list)
        

# Your ZigzagIterator object will be instantiated and called as such:
# i, v = ZigzagIterator(v1, v2), []
# while i.hasNext(): v.append(i.next())

第二种思路:

用两个下标变量记录当前扫描到的下标,一个变量indicator记录当前应该从哪个list里输出。

class ZigzagIterator(object):

    def __init__(self, v1, v2):
        """
        Initialize your data structure here.
        :type v1: List[int]
        :type v2: List[int]
        """
        self.i1, self.i2 = 0, 0
        self.v1, self.v2 = v1, v2
        self.indicator = 0 # 0 for v1, 1 for v2

    def next(self):
        """
        :rtype: int
        """
        if not self.indicator:
            self.indicator = 1
            if self.i1 < len(self.v1):
                self.i1 += 1
                return self.v1[self.i1 - 1]
            else:
                self.i2 += 1
                return self.v2[self.i2 - 1]
        else:
            self.indicator = 0
            if self.i2 < len(self.v2):
                self.i2 += 1
                return self.v2[self.i2 - 1]
            else:
                self.i1 += 1
                return self.v1[self.i1 - 1]                  

    def hasNext(self):
        """
        :rtype: bool
        """
        return self.i1 < len(self.v1) or self.i2 < len(self.v2)

# Your ZigzagIterator object will be instantiated and called as such:
# i, v = ZigzagIterator(v1, v2), []
# while i.hasNext(): v.append(i.next())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值