Solving Leetcode Interviews in Seconds with AI: Peeking Iterator
Introduction
In this blog post, we will explore how to solve the LeetCode problem "284" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
Design an iterator that supports the peek operation on an existing iterator in addition to the hasNext and the next operations. Implement the PeekingIterator class: PeekingIterator(Iterator nums) Initializes the object with the given integer iterator iterator. int next() Returns the next element in the array and moves the pointer to the next element. boolean hasNext() Returns true if there are still elements in the array. int peek() Returns the next element in the array without moving the pointer. Note: Each language may have a different implementation of the constructor and Iterator, but they all support the int next() and boolean hasNext() functions. Example 1: Input ["PeekingIterator", "next", "peek", "next", "next", "hasNext"] [[[1, 2, 3]], [], [], [], [], []] Output [null, 1, 2, 2, 3, false] Explanation PeekingIterator peekingIterator = new PeekingIterator([1, 2, 3]); // [1,2,3] peekingIterator.next(); // return 1, the pointer moves to the next element [1,2,3]. peekingIterator.peek(); // return 2, the pointer does not move [1,2,3]. peekingIterator.next(); // return 2, the pointer moves to the next element [1,2,3] peekingIterator.next(); // return 3, the pointer moves to the next element [1,2,3] peekingIterator.hasNext(); // return False Constraints: 1 <= nums.length <= 1000 1 <= nums[i] <= 1000 All the calls to next and peek are valid. At most 1000 calls will be made to next, hasNext, and peek. Follow up: How would you extend your design to be generic and work with all types, not just integer?
Explanation
- Caching the next element: Store the next element from the iterator in a cache. The
peek()operation simply returns the cached value.- Conditional retrieval: Only retrieve the next element from the underlying iterator when the cache is empty or after
next()has been called. - hasNext implementation:
hasNext()checks if the cache is non-empty or if the underlying iterator has more elements.
- Conditional retrieval: Only retrieve the next element from the underlying iterator when the cache is empty or after
- Runtime Complexity: O(1) for all operations (next, peek, hasNext). Storage Complexity: O(1)
Code
class PeekingIterator:
def __init__(self, iterator):
"""
Initialize your data structure here.
:type iterator: Iterator
"""
self.iterator = iterator
self.next_element = None
if self.iterator.hasNext():
self.next_element = self.iterator.next()
def peek(self):
"""
Returns the next element in the iteration without advancing the iterator.
:rtype: int
"""
return self.next_element
def next(self):
"""
Returns the next element in the iteration and advances the iterator.
:rtype: int
"""
result = self.next_element
if self.iterator.hasNext():
self.next_element = self.iterator.next()
else:
self.next_element = None
return result
def hasNext(self):
"""
Returns true if the iteration has more elements.
:rtype: bool
"""
return self.next_element is not None
#Generic Implementation
class GenericPeekingIterator:
def __init__(self, iterator):
"""
Initialize your data structure here.
:type iterator: Iterator
"""
self.iterator = iterator
self.next_element = None
if self.iterator.hasNext():
self.next_element = self.iterator.next()
def peek(self):
"""
Returns the next element in the iteration without advancing the iterator.
:rtype: any
"""
return self.next_element
def next(self):
"""
Returns the next element in the iteration and advances the iterator.
:rtype: any
"""
result = self.next_element
if self.iterator.hasNext():
self.next_element = self.iterator.next()
else:
self.next_element = None
return result
def hasNext(self):
"""
Returns true if the iteration has more elements.
:rtype: bool
"""
return self.next_element is not None