返回介绍

solution / 0200-0299 / 0281.Zigzag Iterator / README_EN

发布于 2024-06-17 01:04:02 字数 5609 浏览 0 评论 0 收藏 0

281. Zigzag Iterator

中文文档

Description

Given two vectors of integers v1 and v2, implement an iterator to return their elements alternately.

Implement the ZigzagIterator class:

  • ZigzagIterator(List<int> v1, List<int> v2) initializes the object with the two vectors v1 and v2.
  • boolean hasNext() returns true if the iterator still has elements, and false otherwise.
  • int next() returns the current element of the iterator and moves the iterator to the next element.

 

Example 1:

Input: v1 = [1,2], v2 = [3,4,5,6]
Output: [1,3,2,4,5,6]
Explanation: By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,3,2,4,5,6].

Example 2:

Input: v1 = [1], v2 = []
Output: [1]

Example 3:

Input: v1 = [], v2 = [1]
Output: [1]

 

Constraints:

  • 0 <= v1.length, v2.length <= 1000
  • 1 <= v1.length + v2.length <= 2000
  • -231 <= v1[i], v2[i] <= 231 - 1

 

Follow up: What if you are given k vectors? How well can your code be extended to such cases?

Clarification for the follow-up question:

The "Zigzag" order is not clearly defined and is ambiguous for k > 2 cases. If "Zigzag" does not look right to you, replace "Zigzag" with "Cyclic".

Follow-up Example:

Input: v1 = [1,2,3], v2 = [4,5,6,7], v3 = [8,9]
Output: [1,4,8,2,5,9,3,6,7]

Solutions

Solution 1

class ZigzagIterator:
  def __init__(self, v1: List[int], v2: List[int]):
    self.cur = 0
    self.size = 2
    self.indexes = [0] * self.size
    self.vectors = [v1, v2]

  def next(self) -> int:
    vector = self.vectors[self.cur]
    index = self.indexes[self.cur]
    res = vector[index]
    self.indexes[self.cur] = index + 1
    self.cur = (self.cur + 1) % self.size
    return res

  def hasNext(self) -> bool:
    start = self.cur
    while self.indexes[self.cur] == len(self.vectors[self.cur]):
      self.cur = (self.cur + 1) % self.size
      if self.cur == start:
        return False
    return True


# Your ZigzagIterator object will be instantiated and called as such:
# i, v = ZigzagIterator(v1, v2), []
# while i.hasNext(): v.append(i.next())
public class ZigzagIterator {
  private int cur;
  private int size;
  private List<Integer> indexes = new ArrayList<>();
  private List<List<Integer>> vectors = new ArrayList<>();

  public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
    cur = 0;
    size = 2;
    indexes.add(0);
    indexes.add(0);
    vectors.add(v1);
    vectors.add(v2);
  }

  public int next() {
    List<Integer> vector = vectors.get(cur);
    int index = indexes.get(cur);
    int res = vector.get(index);
    indexes.set(cur, index + 1);
    cur = (cur + 1) % size;
    return res;
  }

  public boolean hasNext() {
    int start = cur;
    while (indexes.get(cur) == vectors.get(cur).size()) {
      cur = (cur + 1) % size;
      if (start == cur) {
        return false;
      }
    }
    return true;
  }
}

/**
 * Your ZigzagIterator object will be instantiated and called as such:
 * ZigzagIterator i = new ZigzagIterator(v1, v2);
 * while (i.hasNext()) v[f()] = i.next();
 */
struct ZigzagIterator {
  v1: Vec<i32>,
  v2: Vec<i32>,
  /// `false` represents `v1`, `true` represents `v2`
  flag: bool,
}

impl ZigzagIterator {
  fn new(v1: Vec<i32>, v2: Vec<i32>) -> Self {
    Self {
      v1,
      v2,
      // Initially beginning with `v1`
      flag: false,
    }
  }

  fn next(&mut self) -> i32 {
    if !self.flag {
      // v1
      if self.v1.is_empty() && !self.v2.is_empty() {
        self.flag = true;
        let ret = self.v2.remove(0);
        return ret;
      }
      if self.v2.is_empty() {
        let ret = self.v1.remove(0);
        return ret;
      }
      let ret = self.v1.remove(0);
      self.flag = true;
      return ret;
    } else {
      // v2
      if self.v2.is_empty() && !self.v1.is_empty() {
        self.flag = false;
        let ret = self.v1.remove(0);
        return ret;
      }
      if self.v1.is_empty() {
        let ret = self.v2.remove(0);
        return ret;
      }
      let ret = self.v2.remove(0);
      self.flag = false;
      return ret;
    }
  }

  fn has_next(&self) -> bool {
    !self.v1.is_empty() || !self.v2.is_empty()
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文