何为嵌套数组反转?

举个🌰,下面是一个嵌套数组:

b = [4,[3,[2,[1,null]]]];

嵌套数组反转后的结果是什么?

a = [1,[2,[3,[4,null]]]]

嵌套数组反转有什么特点?

  1. 判断嵌套数组是否结束,是通过数组的第二个元素是否是null来判断的。
  2. 真正反转的是数组的第一个元素之间进行反转。

AC代码

function test() {
let a = [1,[2,[3,[4,null]]]];
const reverse = (arr,temp) => {
if (arr[1] === null) return [arr[0],temp];
temp = temp ? [arr[0], temp] : [arr[0], null];

return reverse(arr[1], temp);
}
return reverse(a);
}

思考与感悟

凡是涉及到嵌套的问题,多和递归有关,递归是解决这类题目的不二法门,类似的题目还有判断嵌套数组的深度,同样需要用到递归。递归为什么难,因为其中涉及到反向思维,反向思维是比较难想的,就以这个题目为例,我们需要先构造一个[1,null],然后把这个数组当做临时变量投入下一次递归中,在下一次递归中构造出[2,[1, null]],然后继续将这个临时数组投入递归中,去构造[3, [2,[1,[null]]]],依次投入递归,最终以null为递归的结束判断条件,得出嵌套数组反转的结果,本题难以想到的是进入递归要用arr[1]和temp,结束递归要根据null来判断,但是如果经过大量训练还是可以把这个题目给想出来的。类似的嵌套数组问题除了使用递归之外,有些题目还用到DFS,因此使用DFS来解决嵌套数组问题也是一个常考题。

参考题目