Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Peeking Iterator

Updated
3 min read

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.
  • 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

More from this blog

C

Chatmagic blog

2894 posts