js逻辑题螺旋矩阵

321 阅读3分钟

螺旋矩阵

题目介绍:

示例一

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]

image.png

示例二

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出: [1,2,3,6,9,8,7,4,5]

矩阵2.png

os:这是从力扣上扒下来的题目,在招聘面试的时候也问过这道题几乎没有什么人可以写出来。其实很简单只有一步一步来解答就可以。

深度剖析:其实不难发现,示例一与示例二都一共只有5个拐点,但是假如是100 * 100 或者更大的矩阵的话那不可能只有5个拐点,如图所示:

image.png 这种情况就得使用递归一层一层进行处理,请看示例:

image.png

第一步

最外层一共有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不走第一步的操作了 如图示

image.png

    完整代码
    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]

完成!! 欢迎指点 感觉应该走了弯路 不过可以实现这个功能