返回

手撕大厂高频面试题:数组扁平化的艺术

前端

手撕大厂常见高频面试题:数组扁平化
大家耳熟能详的电商和社交巨头们,在笔试甚至面试中经常会考察数组扁平化的相关题目,如何将多维数组展开成一维数组成为面试官们的杀手锏。本文将抛砖引玉,手把手教你手撕这道题,助你畅通无阻地进入大厂。

为什么是大厂面试题高频考点?

数组扁平化被大厂面试官青睐的原因显而易见:

  • 算法基础考察: 这道题考查了候选人对数据结构和算法的基本功,尤其考察了对数组的理解和操作能力。

  • 编程能力要求: 通过手撕代码来实现数组扁平化,可以检验候选人的编程能力、逻辑思维能力和代码实现能力。

  • 实际应用场景: 在实际开发中,数组扁平化场景非常广泛,比如从JSON数据中提取所需数据、生成树形结构数据等。

手撕数组扁平化

接下来,我们将手撕实现几种常见的数组扁平化方法:

1. 递归法

public static int[] flatten(int[][] arr) {
    List<Integer> flattened = new ArrayList<>();
    flattenHelper(arr, flattened);
    return flattened.stream().mapToInt(i -> i).toArray();
}

private static void flattenHelper(int[][] arr, List<Integer> flattened) {
    for (int[] row : arr) {
        if (row instanceof int[][]) {
            flattenHelper((int[][]) row, flattened);
        } else {
            for (int num : row) {
                flattened.add(num);
            }
        }
    }
}

2. 栈法

public static int[] flatten(int[][] arr) {
    Stack<Integer[]> stack = new Stack<>();
    stack.push(arr);
    List<Integer> flattened = new ArrayList<>();

    while (!stack.isEmpty()) {
        Integer[] row = stack.pop();
        for (Integer num : row) {
            if (num instanceof int[]) {
                stack.push((int[]) num);
            } else {
                flattened.add(num);
            }
        }
    }

    return flattened.stream().mapToInt(i -> i).toArray();
}

3. 队列法

public static int[] flatten(int[][] arr) {
    Queue<Integer[]> queue = new LinkedList<>();
    queue.offer(arr);
    List<Integer> flattened = new ArrayList<>();

    while (!queue.isEmpty()) {
        Integer[] row = queue.poll();
        for (Integer num : row) {
            if (num instanceof int[]) {
                queue.offer((int[]) num);
            } else {
                flattened.add(num);
            }
        }
    }

    return flattened.stream().mapToInt(i -> i).toArray();
}

4. Stream流处理法(Java 8+)

public static int[] flatten(int[][] arr) {
    return Arrays.stream(arr)
            .flatMapToInt(row -> Arrays.stream(row))
            .toArray();
}

总结

数组扁平化是数据结构和算法面试题的常见考点,掌握多种实现方法可以有效提升你在大厂面试中的竞争力。本文通过手撕递归、栈、队列和Stream流处理法,演示了如何将多维数组展平为一维数组,希望对你有所帮助。

在实际面试中,面试官可能会考察你的时间复杂度、空间复杂度等方面的理解,因此除了会写代码外,还要深入理解算法的原理和优化策略,这样才能在大厂面试中脱颖而出。