《LeetCode之每日一题》:169.顶端迭代器

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:169.顶端迭代器相关的知识,希望对你有一定的参考价值。

顶端迭代器


题目链接: 顶端迭代器

有关题目

请你设计一个迭代器,除了支持 hasNext 和 next 操作外,还支持 peek 操作。

实现 PeekingIterator 类:

	PeekingIterator(int[] nums) 使用指定整数数组 nums 初始化迭代器。
	int next() 返回数组中的下一个元素,并将指针移动到下个元素处。
	bool hasNext() 如果数组中存在下一个元素,返回 true ;否则,返回 falseint peek() 返回数组中的下一个元素,但 不 移动指针。
示例:

输入:
["PeekingIterator", "next", "peek", "next", "next", "hasNext"]
[[[1, 2, 3]], [], [], [], [], []]
输出:
[null, 1, 2, 2, 3, false]

解释:
PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3]
peekingIterator.next();    // 返回 1 ,指针移动到下一个元素 [1,(2),3],注意函数next函数实现返回值
peekingIterator.peek();    // 返回 2 ,指针未发生移动 [1,(2),3]
peekingIterator.next();    // 返回 2 ,指针移动到下一个元素 [1,2,(3)]
peekingIterator.next();    // 返回 3 ,指针移动到下一个元素 [1,2,3]
peekingIterator.hasNext(); // 返回 False
提示:

1 <= nums.length <= 1000
1 <= nums[i] <= 1000
对 next 和 peek 的调用均有效
next、hasNext 和 peek 最多调用  1000
进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?

题解

法一:迭代器
C++类模板template <class T>
参考官方题解

/*
 * Below is the interface for Iterator, which is already defined for you.
 * **DO NOT** modify the interface for Iterator.
 *
 *  class Iterator {
 *		struct Data;
 * 		Data* data;
 *  public:
 *		Iterator(const vector<int>& nums);
 * 		Iterator(const Iterator& iter);
 *
 * 		// Returns the next element in the iteration.
 *		int next();
 *
 *		// Returns true if the iteration has more elements.
 *		bool hasNext() const;
 *	};
 */

class PeekingIterator : public Iterator {
public:
	PeekingIterator(const vector<int>& nums) : Iterator(nums) {
	    // Initialize any member here.
	    // **DO NOT** save a copy of nums and manipulate it directly.
	    // You should only use the Iterator interface methods.
	    flag = Iterator::hasNext();
        if (flag)
        {
            nextElement = Iterator::next();
        }
	}
	
    // Returns the next element in the iteration without advancing the iterator.
	int peek() {
        return nextElement;
	}
	
	// hasNext() and next() should behave the same as in the Iterator interface.
	// Override them if needed.
	int next() {
	    int ret = nextElement;
        flag = Iterator::hasNext();
        if (flag)
        {
            nextElement = Iterator::next();
        }
        return ret;
	}
	
	bool hasNext() const {
	    return flag;
	}
private:
    int nextElement;
    bool flag;

};

进阶:
参考官方题解

拓展顶端迭代器的设计,使其适用于所有类型,不局限于整数
C++可以通过使用泛型的方式拓展设计.
template <class T>
class PeekingIterator : public Iterator<T> {
public:
    PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {
        flag = Iterator<T>::hasNext();
        if (flag) {
            nextElement = Iterator<T>::next();
        }
    }
    
    T peek() {
        return nextElement;
    }

    T next() {
        T ret = nextElement;
        flag = Iterator<T>::hasNext();
        if (flag) {
            nextElement = Iterator<T>::next();
        }
        return ret;
    }
    
    bool hasNext() const {
        return flag;
    }
private:
    T nextElement;
    bool flag;
};

以上是关于《LeetCode之每日一题》:169.顶端迭代器的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:287.反转链表

Leetcode 284.顶端迭代器

《LeetCode之每日一题》:174.排列硬币

《LeetCode之每日一题》:287.反转链表

LeetCode 解题大纲(每日一题C++自用)

《LeetCode之每日一题》:280.矩阵置零