天机阁

341. 扁平化嵌套列表迭代器

2022-07-09 · 4 min read
LeetCode

题目

给你一个嵌套的整数列表 nestedList 。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。

实现扁平迭代器类 NestedIterator :

  • NestedIterator(List nestedList) 用嵌套列表 nestedList 初始化迭代器。
  • int next() 返回嵌套列表的下一个整数。
  • boolean hasNext() 如果仍然存在待迭代的整数,返回 true ;否则,返回 false 。

难度:🌟🌟🌟

你的代码将会用下述伪代码检测:

initialize iterator with nestedList
res = []
while iterator.hasNext()
    append iterator.next() to the end of res
return res

如果 res 与预期的扁平化列表匹配,那么你的代码将会被判为正确。

示例 1:

输入:nestedList = [[1,1],2,[1,1]]
输出:[1,1,2,1,1]
解释:通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。

示例 2:

输入:nestedList = [1,[4,[6]]]
输出:[1,4,6]
解释:通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,4,6]。

提示:

  • 1 <= nestedList.length <= 500
  • 嵌套列表中的整数值在范围 [-106, 106] 内

题解

这题难点在于初始化时,给定的嵌套列表没有明确的嵌套深度,因此需要我们递归解析嵌套列表并完成初始化。

代码实现

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * type NestedInteger struct {
 * }
 *
 * // Return true if this NestedInteger holds a single integer, rather than a nested list.
 * func (this NestedInteger) IsInteger() bool {}
 *
 * // Return the single integer that this NestedInteger holds, if it holds a single integer
 * // The result is undefined if this NestedInteger holds a nested list
 * // So before calling this method, you should have a check
 * func (this NestedInteger) GetInteger() int {}
 *
 * // Set this NestedInteger to hold a single integer.
 * func (n *NestedInteger) SetInteger(value int) {}
 *
 * // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 * func (this *NestedInteger) Add(elem NestedInteger) {}
 *
 * // Return the nested list that this NestedInteger holds, if it holds a nested list
 * // The list length is zero if this NestedInteger holds a single integer
 * // You can access NestedInteger's List element directly if you want to modify it
 * func (this NestedInteger) GetList() []*NestedInteger {}
 */

type NestedIterator struct {
    data []int
    pos int
}

func Constructor(nestedList []*NestedInteger) *NestedIterator {
    if nestedList == nil {
        return nil
    }
    data := convertNestedList(nestedList)
    return &NestedIterator{
        data: data,
        pos: 0,
    }
}

// convertNestedList 转换 NestedInteger 数组
func convertNestedList(list []*NestedInteger) (res []int) {
    var convert func(nestedList []*NestedInteger)

    convert = func(nestedList []*NestedInteger) {
        if nestedList == nil {
            return
        }
        for _, nest := range nestedList {
            if nest.IsInteger() {
                res = append(res, nest.GetInteger())
            } else {
                convert(nest.GetList())
            }
        }
        return
    }
    convert(list)
    return
}

func (this *NestedIterator) Next() int {
    res := this.data[this.pos]
    this.pos++
    return res
}

func (this *NestedIterator) HasNext() bool {
    return this.pos < len(this.data)
}