Peeking İterator LeetCode Həlli

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon alma eBay Facebook google microsoft YahooBaxılıb 26

Problem bəyanat

Peeking İterator LeetCode Həlli – Dəstəkləyən iterator dizayn edin peek əlavə olaraq mövcud iteratorda əməliyyat hasNext və next əməliyyatları.

Həyata keçirir PeekingIterator sinif:

  • PeekingIterator(Iterator<int> nums) Verilmiş tam ədəd iteratoru ilə obyekti işə salır iterator.
  • int next() Massivdəki növbəti elementi qaytarır və göstəricini növbəti elementə köçürür.
  • boolean hasNext() Yekunları true massivdə hələ də elementlər varsa.
  • int peek() Massivdəki növbəti elementi qaytarır olmadan göstəricini hərəkət etdirin.

Qeyd: Hər bir dildə konstruktorun fərqli icrası ola bilər və Iterator, amma hamısı dəstəkləyir int next() və boolean hasNext() funksiyaları.

misal

Test işi 1:

Input:

[“PeekingIterator”, “next”, “peek”, “next”, “next”, “hasNext”]

[[[1, 2, 3]], [], [], [], [], []]

Çıxış:

[null, 1, 2, 2, 3, false]

Izahat

PeekingIterator peekingIterator = yeni PeekingIterator([1, 2, 3]); // [1,2,3] peekingIterator.next(); // 1-i qaytarın, göstərici növbəti elementə keçir [1,2,3]. peekingIterator.peek(); // 2-ni qaytarın, göstərici hərəkət etmir [1,2,3]. peekingIterator.next(); // 2-ni qaytarın, göstərici növbəti elementə keçir [1,2,3] peekingIterator.next(); // 3-ü qaytarın, göstərici növbəti elementə keçir [1,2,3] peekingIterator.hasNext(); // False qaytarın

Peeking İterator LeetCode HəlliPin

Yanaşma:

Idea:

Bu, mənim fikrimcə, alqoritmik deyil, daha çox dizayn problemidir. Siz artıq həyata keçirilən sinif verdiniz iterator, bir siyahı kimi başa düşə bilərsiniz, lakin bu siyahı deyil. Məqsəd sözdə peeking həyata keçirməkdir təkrarlayıcı və bunu etmək üçün bir addım öndə olmalıyıq: yaradaq self.buffer iteratorumuzdan növbəti dəyəri saxlayacaq dəyişən.

  1. Zəng etdiyimiz zaman peek funksiyası, biz sadəcə buferimizdən dəyəri qaytarırıq.
  2. Zəng etdiyimiz zaman next funksiyası üçün bufer dəyişənini yazırıq tmp, onda biz buferimizi yeniləyirik: növbəti elementimiz varsa, növbəti elementə keçirik, yoxdursa, onu bərabər edirik. None.
  3. Nəhayət, hasNext funksiya indi sadəcə buferin boş olub olmadığını yoxlayır.

Peeking İterator üçün kod

Java Proqramı

// Java Iterator interface reference:
// https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

class PeekingIterator implements Iterator<Integer> {
    private Iterator<Integer> iterator;
    private Integer temp;

        public PeekingIterator(Iterator<Integer> iterator) {
            this.iterator = iterator;
        }
        
    // Returns the next element in the iteration without advancing the iterator.
        public Integer peek() {
        if (!hasNext()) return null;
        if (temp == null) {
            temp = iterator.next();
        }
        return temp;
        }
        
        // hasNext() and next() should behave the same as in the Iterator interface.
        // Override them if needed.
        @Override
        public Integer next() {
        if (!hasNext()) return null;
        if (temp == null) {
            Integer next = iterator.next();
            return next;
        } else {
            Integer next = temp;
            temp = null;
                return next;
        }
        }
        
        @Override
        public boolean hasNext() {
            return temp != null || iterator.hasNext();
        }
}

Python proqramı

# Below is the interface for Iterator, which is already defined for you.
#
# class Iterator(object):
#     def __init__(self, nums):
#         """
#         Initializes an iterator object to the beginning of a list.
#         :type nums: List[int]
#         """
#
#     def hasNext(self):
#         """
#         Returns true if the iteration has more elements.
#         :rtype: bool
#         """
#
#     def next(self):
#         """
#         Returns the next element in the iteration.
#         :rtype: int
#         """

class PeekingIterator:
    def __init__(self, iterator):
        self.iterator = iterator
        self.buffer = self.iterator.next() if self.iterator.hasNext() else None
        
    def peek(self):
        return self.buffer
        
    def next(self):
        tmp = self.buffer
        self.buffer = self.iterator.next() if self.iterator.hasNext() else None
        return tmp
        
    def hasNext(self):
        return self.buffer != None
        

# Your PeekingIterator object will be instantiated and called as such:
# iter = PeekingIterator(Iterator(nums))
# while iter.hasNext():
#     val = iter.peek()   # Get the next element but not advance the iterator.
#     iter.next()         # Should return the same value as [val].

Peeking İterator LeetCode Həlli üçün Mürəkkəblik Təhlili

Zamanın mürəkkəbliyi: O (1)

Kosmik mürəkkəblik: O (1)

Referans: https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

Translate »