返回
手撕大厂高频面试题:数组扁平化的艺术
前端
2023-12-24 15:24:31
手撕大厂常见高频面试题:数组扁平化
大家耳熟能详的电商和社交巨头们,在笔试甚至面试中经常会考察数组扁平化的相关题目,如何将多维数组展开成一维数组成为面试官们的杀手锏。本文将抛砖引玉,手把手教你手撕这道题,助你畅通无阻地进入大厂。
为什么是大厂面试题高频考点?
数组扁平化被大厂面试官青睐的原因显而易见:
-
算法基础考察: 这道题考查了候选人对数据结构和算法的基本功,尤其考察了对数组的理解和操作能力。
-
编程能力要求: 通过手撕代码来实现数组扁平化,可以检验候选人的编程能力、逻辑思维能力和代码实现能力。
-
实际应用场景: 在实际开发中,数组扁平化场景非常广泛,比如从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流处理法,演示了如何将多维数组展平为一维数组,希望对你有所帮助。
在实际面试中,面试官可能会考察你的时间复杂度、空间复杂度等方面的理解,因此除了会写代码外,还要深入理解算法的原理和优化策略,这样才能在大厂面试中脱颖而出。