持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
何为嵌套数组反转?
举个🌰,下面是一个嵌套数组:
b = [4,[3,[2,[1,null]]]];
嵌套数组反转后的结果是什么?
a = [1,[2,[3,[4,null]]]]
嵌套数组反转有什么特点?
- 判断嵌套数组是否结束,是通过数组的第二个元素是否是null来判断的。
- 真正反转的是数组的第一个元素之间进行反转。
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来解决嵌套数组问题也是一个常考题。