java - 在 Java 中展平列表

标签 java algorithm list

我在面试中被问到这个问题

Given a hypothetical list in java that, along with holding integer content, may also hold another list of similar type

示例:[1,3,5,[6,7],8,9,10,[11,13,15,[16,17,[18,19]]],20]

输出应该是:

[1,3,5,6,7,8,9,10,11,13,15,16,17,18,19,20]

我觉得很简单!所以我想出了一个解决问题的递归解决方案!还是不行?

面试官说子列表可以深入到任何深度,因此可能会导致 stackoverflow 错误!

我尝试想出一个非递归的解决方案,但做不到。谁能说出非递归解决方案可能是什么?

最佳答案

您可以将 LinkedList 用作堆栈。

public static List<Object> flattenNonRecursive(List<Object> list) {
    List<Object> result = new ArrayList<>();
    LinkedList<Object> stack = new LinkedList<>(list);
    while (!stack.isEmpty()) {
        Object e = stack.pop();
        if (e instanceof List<?>)
            stack.addAll(0, (List<?>)e);
        else
            result.add(e);
    }
    return result;
}

public static List<Object> list(Object... args) {
    return Arrays.asList(args);
}

public static void main(String[] args) {
    List<Object> list = list(1, 3, 5, list(6, 7), 8, 9, 10, list(11, 13, 15, list(16, 17, list(18, 19))), 20);
    System.out.println("flatten=" + flattenNonRecursive(list));
}

结果

flatten=[1, 3, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 17, 18, 19, 20]

关于java - 在 Java 中展平列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30950677/

相关文章:

java - 如何使用 GSON 获取两个 json 对象之间的差异?

arrays - 在两个排序数组中查找缺失的数字

c# - 找出所有给定数组中公共(public)元素的最佳算法

python - 具体排序由点分隔的数字列表

android - 如何在 List<int> 中使用 "where",就像在 android 中的 c#

java - 我的 Controller 在运行时工作,但 mockkmvc 测试失败,因为依赖项甚至不在类中

java - 如何最小化UDP丢包

java - 为什么即使我没有更改或设置任何值,全局列表也会受到影响?

java - 当太多并行上传(堆空间)时,JVM/Tomcat 崩溃?

python - 执行 15 题的终止条件应该是什么?