Scribbling

LeetCode: 341. Flatten Nested List Iterator 본문

Computer Science/Coding Test

LeetCode: 341. Flatten Nested List Iterator

focalpoint 2022. 1. 13. 14:43

Making a new list is an easy solution to implement with recursion.

class NestedIterator:
    def __init__(self, nestedList: [NestedInteger]):
        self.res = []
        self._flattener(nestedList)
        self.ptr = 0
            
    def _flattener(self, nestedList):
        for nl in nestedList:
            if nl.isInteger():
                self.res.append(nl.getInteger())
            else:
                self._flattener(nl.getList())
    
    def next(self) -> int:
        ret = self.res[self.ptr]
        self.ptr += 1
        return ret
    
    def hasNext(self) -> bool:
        return self.ptr < len(self.res)
         

# Your NestedIterator object will be instantiated and called as such:
# i, v = NestedIterator(nestedList), []
# while i.hasNext(): v.append(i.next())

 

However, above does not seem to act like an real iterator, as it is not lazy.

We can use 'yield' to make something really works like an iterator as below.

class NestedIterator:
    def __init__(self, nestedList: [NestedInteger]):
        def _generator(nestedList):
            for nl in nestedList:
                if nl.isInteger():
                    yield nl.getInteger()
                else:
                    yield from _generator(nl.getList())
        self.gen = _generator(nestedList)
        self.nextelem = next(self.gen, None)
    
    def next(self) -> int:
        ret = self.nextelem
        self.nextelem = next(self.gen, None)
        return ret
    
    def hasNext(self) -> bool:
        return self.nextelem != None