算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 顶端迭代器,我们先来看题面:
https://leetcode-cn.com/problems/peeking-iterator/
Design an iterator that supports the peek operation on a list in addition to the hasNext and the next operations.
Implement the PeekingIterator class:
PeekingIterator(int[] nums) Initializes the object with the given integer array nums.
int next() Returns the next element in the array and moves the pointer to the next element.
bool hasNext() Returns true if there are still elements in the array.
int peek() Returns the next element in the array without moving the pointer.
给定一个迭代器类的接口,接口包含两个方法:next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。
示例
假设迭代器被初始化为列表 [1,2,3]。
调用 next() 返回 1,得到列表中的第一个元素。
现在调用 peek() 返回 2,下一个元素。在此之后调用 next() 仍然返回 2。
最后一次调用 next() 返回 3,末尾元素。在此之后调用 hasNext() 应该返回 false。
进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?
解题
设一个 peeked 的flag 同时 保存 peeked 过得值. 如果已经peeked过了, next()直接返回保存的值即可.
// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
class PeekingIterator implements Iterator<Integer> {
Iterator<Integer> itr;
boolean peeked;
int peekVal;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
this.itr = iterator;
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
if(peeked) {
return peekVal;
} else {
peeked = true;
peekVal = itr.next();
}
return peekVal;
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
if(peeked) {
peeked = false;
return peekVal;
} else return itr.next();
}
@Override
public boolean hasNext() {
return peeked || itr.hasNext();
}
}
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。
上期推文: