LeetCode/solutions/284. Peeking Iterator.md
ShusenTang 827105a6fe add 284 🍺
2020-07-16 11:43:15 +08:00

62 lines
1.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# [284. Peeking Iterator](https://leetcode.com/problems/peeking-iterator/)
# 思路
我们有了一个只支持`next`和`hasNext`方法的迭代器类,让我们实现一个子类,要求增添一个`peek`方法。
## 思路一
我们想实现的`peek`是只返回当前元素而不考虑指针后移。但每次调用基类的`next`时,返回当前元素后都会后移指针。那么我们可以考虑用一个变量`value`在调用基类的`next`时缓存当前元素,这样的话即使指针后移了,我们调用`peek`时也能直接返回value。为此我们需要一个bool变量`flag`来指示`value`是否存放了在之后调用`peek`和`next`应该返回的值。
## 思路二
还有一个比较tricky的方法`peek`时创建一个当前指针对应的副本,由于是局部变量,所以调用结束后会被销毁,所以并没有任何内存问题。
# C++
## 思路一
``` C++
class PeekingIterator : public Iterator {
private:
bool flag;
int value;
public:
PeekingIterator(const vector<int>& nums) : Iterator(nums) {
flag = false; // value是否存放了peek和next应该返回的值
}
int peek(){
if(!flag) value = Iterator::next();
flag = true;
return value;
}
int next() {
if(!flag) return Iterator::next();
flag = false;
return value;
}
bool hasNext() const {
return flag || Iterator::hasNext();
}
};
```
## 思路二
``` C++
class PeekingIterator : public Iterator {
public:
PeekingIterator(const vector<int>& nums) : Iterator(nums) {}
int peek(){
// 调用Iterator(const Iterator& iter)创造一个副本
return Iterator(*this).next();
}
// int next() {}
// bool hasNext() const {}
};
```