Mündəricat
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ıriterator
.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
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.
- Zəng etdiyimiz zaman
peek
funksiyası, biz sadəcə buferimizdən dəyəri qaytarırıq. - Zəng etdiyimiz zaman
next
funksiyası üçün bufer dəyişənini yazırıqtmp
, onda biz buferimizi yeniləyirik: növbəti elementimiz varsa, növbəti elementə keçirik, yoxdursa, onu bərabər edirik.None
. - 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