Сведение списка, содержащего подсписки
Я пытаюсь найти решение проблемы, чтобы пройти через онлайн-судью по Leetcode. Проблема заключается в следующем: учитывая вложенный список целых чисел, реализовать итератор для его выравнивания.
Каждый элемент является либо целым числом, либо списком, элементы которого также могут быть целыми числами или другими списками.
Пример 1: приведен список [[1,1],2,[1,1]],
При повторном вызове next до тех пор, пока hasNext не вернет false, порядок элементов, возвращаемых next, должен быть следующим: [1,1,2,1,1]
Полная проблема здесь.
Проблема утверждает, что он будет создавать экземпляр класса, который реализован с использованием следующего кода:
# Your NestedIterator object will be instantiated and called as such:
# i, v = NestedIterator(nestedList), []
# while i.hasNext(): v.append(i.next())
Ниже мое решение:
class NestedIterator(object):
currIdx = 0
def __init__(self, nestedList):
"""
Initialize your data structure here.
:type nestedList: List[NestedInteger]
"""
newFlattenedList = []
self.flattenList(nestedList, newFlattenedList)
nestedList = newFlattenedList
self.flattenedList = nestedList
def flattenList(self, nestedList, flattenedList):
for ele in nestedList:
if type(ele) == list and ele > 0:
self.flattenList(ele, flattenedList)
else:
flattenedList.append(ele)
return
def next(self):
"""
:rtype: int
"""
if self.hasNext():
test = self.flattenedList[self.currIdx]
self.currIdx +=1
return test
else:
return NULL
def hasNext(self):
"""
:rtype: bool
"""
nextIdx = self.currIdx + 1
return True if nextIdx <= len(self.flattenedList) else False
Когда я запускаю этот код в IDE со входом [[1,1],2,[1,1]], я получаю вывод [1,1,2,1,1]. По какой-то причине, когда я запускаю код с онлайн-судьей, учитывая ввод [[1,1],2,[1,1]], вывод будет [[1,1], 2, [1,1] ] возвращается. Почему онлайн-судья leetcode возвращает что-то другое?
2 ответа
Вы имели в виду None
не NULL
право?
def next(self):
"""
:rtype: int
"""
if self.hasNext():
test = self.flattenedList[self.currIdx]
self.currIdx +=1
return test
else:
#return NULL
return None
Запустив:
nestedList = [[1,1],2,[1,1]]
i, v = NestedIterator(nestedList), []
while i.hasNext(): v.append(i.next())
print v
Я получил:
[1, 1, 2, 1, 1]
Итак, кроме изменения NULL на None, я не знаю.
Ваше решение имеет 2 проблемы.
- Измените return NULL на None в следующем методе.
- В flattenList сравнение размеров элементов работает только в Python 2! Добавьте функцию len(), чтобы она работала на Python 3.
Вот модифицированный код. Это должно работать везде.
class NestedIterator(object):
currIdx = 0
def __init__(self, nestedList):
"""
Initialize your data structure here.
:type nestedList: List[NestedInteger]
"""
newFlattenedList = []
self.flattenList(nestedList, newFlattenedList)
nestedList = newFlattenedList
self.flattenedList = nestedList
def flattenList(self, nestedList, flattenedList):
for ele in nestedList:
if type(ele) == list and len(ele) > 0:
self.flattenList(ele, flattenedList)
else:
flattenedList.append(ele)
return
def next(self):
"""
:rtype: int
"""
if self.hasNext():
test = self.flattenedList[self.currIdx]
self.currIdx +=1
return test
else:
return None
def hasNext(self):
"""
:rtype: bool
"""
nextIdx = self.currIdx + 1
return True if nextIdx <= len(self.flattenedList) else False