小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
请你设计一个迭代器,除了支持 hasNext 和 next 操作外,还支持 peek 操作。
实现 PeekingIterator 类:
PeekingIterator(int[] nums)使用指定整数数组nums初始化迭代器。int next()返回数组中的下一个元素,并将指针移动到下个元素处。bool hasNext()如果数组中存在下一个元素,返回true;否则,返回false。int 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]
peekingIterator.peek(); // 返回 2 ,指针未发生移动 [1,2,3]
peekingIterator.next(); // 返回 2 ,指针移动到下一个元素 [1,2,3]
peekingIterator.next(); // 返回 3 ,指针移动到下一个元素 [1,2,3]
peekingIterator.hasNext(); // 返回 False
提示
1 <= nums.length <= 10001 <= nums[i] <= 1000- 对
next和peek的调用均有效 next、hasNext和peek最多调用1000次
解题思路
看了官方题解,使用了一个迭代器还有一个Integer类型的变量,但又好像什么都没体现到。这里用队列来做题解,算是重写熟悉一下先进先出的数据结构吧。
代码实现
class PeekingIterator implements Iterator<Integer> {
private Queue<Integer> queue;
public PeekingIterator(Iterator<Integer> iterator) {
// initialize any member here.
this.queue = new LinkedList<>();
// 遍历所有元素,存入队列中。
while(iterator.hasNext()){
queue.add(iterator.next());
}
}
// Returns the next element in the iteration without advancing the iterator.
public Integer peek() {
// 展示首位元素
return queue.peek();
}
// hasNext() and next() should behave the same as in the Iterator interface.
// Override them if needed.
@Override
public Integer next() {
// 弹出首位元素
return queue.poll();
}
@Override
public boolean hasNext() {
// 判断非空
return !this.queue.isEmpty();
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!