螺旋矩阵
题目介绍:
示例一
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
示例二
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]
os:这是从力扣上扒下来的题目,在招聘面试的时候也问过这道题几乎没有什么人可以写出来。其实很简单只有一步一步来解答就可以。
深度剖析:其实不难发现,示例一与示例二都一共只有5个拐点,但是假如是100 * 100 或者更大的矩阵的话那不可能只有5个拐点,如图所示:
这种情况就得使用递归一层一层进行处理,请看示例:
第一步
最外层一共有4组值,第一组为数组第一项的所有值,第二组为数组所有元素的最后一项,第三组值数组元素的最后一项的倒叙,第四组是除去数组第一项的第一个值的倒叙,因为第一组第二组第三组的最后重复,故而都得过滤掉最后一项。
先给定一个5*5的数组
const arr = [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
];
给定一个过滤最后一项的函数
const getFilter = (n = []) => {
return n.filter((v, i) => i < n.length - 1);
};
先取第一圈的值
const a = JSON.parse(JSON.stringify(arr));
const b = JSON.parse(JSON.stringify(arr));
const one =getFilter(arr[0]);
const two = getFilter(arr.map((v) => v[v.length - 1])) ;
const three =getFilter(a[a.length - 1].reverse()) ;
const four = getFilter(b.reverse()).map((v) => (v[0]));
// 得出:
// one = [1, 2, 3, 4]
// two = [5, 10, 15, 20]
// three = [25, 24, 23, 22]
// four = [21, 16, 11, 6]
再将最外层给去除掉 原理就是 数组的第一项与最后一项不要 其他的相的元素不要首尾
const newArr = JSON.parse(JSON.stringify(arr))
.filter((v, i) => i !== 0 && i !== d.length - 1)
.map((v) => {
const item = JSON.parse(JSON.stringify(v));
return item.filter(
(val, index) => index !== 0 && index !== item.length - 1,
);
});
第二步
根据条件进行递归
注意当前所剩数组长度小于3的时候,那就是直接push不走第一步的操作了 如图示
完整代码
d是当前所剩的值 sum是记录的值
const matrix = (d = [], sum = []) => {
const getFilter = (n = []) => {
return n.filter((v, i) => i < n.length - 1);
};
if (d.length > 2) {
const a = JSON.parse(JSON.stringify(d));
const b = JSON.parse(JSON.stringify(d));
const one = getFilter(d[0]);
const two = getFilter(d.map((v) => v[v.length - 1]));
const three = getFilter(a[a.length - 1].reverse());
const four = getFilter(b
.reverse()).map((v) => (v[0]));
sum = [
...sum,
...one,
...two,
...three,
...four,
];
const newArr = JSON.parse(JSON.stringify(d))
.filter((v, i) => i !== 0 && i !== d.length - 1)
.map((v) => {
const item = JSON.parse(JSON.stringify(v));
return item.filter(
(val, index) => index !== 0 && index !== item.length - 1,
);
});
return matrix(newArr, sum);
} else {
d.forEach((v, i) => {
if (i === 0) {
sum = [...sum, ...v];
} else {
const obj = JSON.parse(JSON.stringify(v));
sum = [...sum, ...obj.reverse()];
}
});
return sum;
}
};
matrix(arr)
输入 [
[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25],
]
输出 [1, 2, 3, 4, 5, 10, 15, 20, 25, 24, 23, 22, 21, 16, 11, 6, 7, 8, 9, 14, 19, 18, 17, 12, 13]
输入 [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
输出 [1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7]
输入 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
输出 [1, 2, 3, 6, 9, 8, 7, 4, 5]
完成!! 欢迎指点 感觉应该走了弯路 不过可以实现这个功能