LeetCode每日一题|284. 顶端迭代器

119 阅读1分钟

题目描述

题目链接:leetcode-cn.com/problems/pe…

image.png

思路分析

在该题中需要实现一个迭代器的类,而在创建该迭代器时回传进一个以实现的迭代器,我们只需要新添加peek函数的功能即可,对此有两种实现的思路。

第一种,我们可以先将传进的迭代器的数据用数组储存起来,然后再记录索引,这样在实现peek函数时,只需要将当前下一个值直接传回就好

第二种,我们可以存储该传入的迭代器,后续实现时调用该迭代器的方法即可,为了实现peek函数,可以记录下该迭代器的下一位值,然后在使用时直接返回即可。

对于该传入的迭代器可以这么理解,它本身并没有值,有的是一个指针指向一个值,在调用next函数时就会返回该迭代器指向的值,然后指向下一个数,而hasNext函数是看当前迭代器是否有指向一个值

代码

  • 思路1

/**
 * @param {Iterator} iterator
 */
var PeekingIterator = function (iterator) {
  this.arr = [];
  this.index = 0;
  while(iterator.hasNext()) {
    this.arr.push(iterator.next());
  }
};

/**
 * @return {number}
 */
PeekingIterator.prototype.peek = function () {
  return this.arr[this.index];
};

/**
 * @return {number}
 */
PeekingIterator.prototype.next = function () {
  return this.arr[this.index++];
};

/**
 * @return {boolean}
 */
PeekingIterator.prototype.hasNext = function () {
  return this.arr.length > this.index;
};
  • 思路2

/**
 * @param {Iterator} iterator
 */
var PeekingIterator = function (iterator) {
  this.mIterator = iterator;
  this.mmIterator = this.mIterator.next();
};

/**
 * @return {number}
 */
PeekingIterator.prototype.peek = function () {
  return this.mmIterator;
};

/**
 * @return {number}
 */
PeekingIterator.prototype.next = function () {
  let t = this.mmIterator;
  this.mmIterator = this.mIterator.hasNext() ? this.mIterator.next() : null;
  return t;
};

/**
 * @return {boolean}
 */
PeekingIterator.prototype.hasNext = function () {
  return (typeof this.mmIterator) == 'number';
};