給定一個擁有 next() 和 hasNext() 的 Iterator 接口,設計一個 PeekingIterator,增加 peek() 方法:返回下一個元素但不移動指針。多次調用 peek() 返回相同值,不影響 next()/hasNext() 行為。
維護兩個狀態變量:
peeked:是否已緩存下一個元素peekVal:緩存的元素值class Iterator:
def __init__(self, nums):
self.nums = nums
self.idx = 0
def hasNext(self):
return self.idx < len(self.nums)
def next(self):
if self.hasNext():
val = self.nums[self.idx]
self.idx += 1
return val
raise StopIteration()
class PeekingIterator:
def __init__(self, iterator):
self.iterator = iterator
self.peeked = False
self.peekVal = None
def peek(self):
if not self.peeked:
self.peekVal = self.iterator.next()
self.peeked = True
return self.peekVal
def next(self):
if self.peeked:
self.peeked = False
return self.peekVal
return self.iterator.next()
def hasNext(self):
return self.peeked or self.iterator.hasNext()
class PeekingIterator : public Iterator {
bool hasPeeked = false;
int peekedVal;
public:
PeekingIterator(const vector<int>& nums) : Iterator(nums) {}
int peek() {
if (!hasPeeked) {
peekedVal = Iterator::next();
hasPeeked = true;
}
return peekedVal;
}
int next() {
if (hasPeeked) {
hasPeeked = false;
return peekedVal;
}
return Iterator::next();
}
bool hasNext() const {
return hasPeeked || Iterator::hasNext();
}
};
| 方法 | 行為 |
|---|---|
peek() | 若未緩存,調用底層 next() 獲取並緩存;返回緩存值 |
next() | 若有緩存,返回緩存並清除標記;否則調用底層 next() |
hasNext() | 若有緩存必為 true;否則委託底層 |
nums = [1,2,3] it = PeekingIterator(nums) it.next() -> 1 it.peek() -> 2 (緩存 2) it.peek() -> 2 (直接返回緩存) it.next() -> 2 (消費緩存) it.next() -> 3 it.hasNext() -> false
peeked 標記避免重複調用底層 next()peek()/next() 行為依賴底層實現(拋異常或未定義)