原神四个每日委托的方式刷leetCode题目(第一天)js

168 阅读2分钟

每天晚上都会打原神,每日委托领取60原石,所以做完四个任务对我来说已经习惯了 今天又是上号的一天,每天刷四题目

委托1:

59. 螺旋矩阵 II

难度中等 1066 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

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

代码如下

var generateMatrix = function (n) {
    const matrix = new Array(n).fill().map(() => new Array(n).fill(0))
    let top = 0
    let left = 0
    let right = n - 1
    let bottom = n - 1
    let num = 1
    let dir = "right"
 while (top <= bottom && left <= right) {
        if (dir == "right") {
            for (let i = left; i <= right; i++) {
                matrix[top][i] = num++
            }
            top++
            dir = "down"
        }
        if (dir == "down") {
            for (let i = top; i <= bottom; i++) {
                matrix[i][right] = num++
            }
            right--
            dir = "left"
        }
        if (dir == "left") {
            for (let i = right; i >= left; i--) {
                matrix[bottom][i] = num++
            }
            bottom--
            dir = "up"
        }
        if (dir == "up") {
            for (let i = bottom; i >= top; i--) {
                matrix[i][left] = num++
            }
            left++
            dir = "right"
        }
    }
    return matrix
}

说一下重要的概念,叫二维数组,有点像仓库队伍,班级,的行和列的概念,高深一点也叫矩阵matrix啦

1.第一步====== 搭架子

必背:1.新建一个n列n行的二维数组的公式:(新数组n行,填充0,map箭头新数组m列填充0)

const matrix = new Array(n).fill(0).map(()=>new Array(m).fill(0))

框架搭好后,下面就要进行第二步,定义变量啦 直接上图,这是我们搭的一个二维数组架子

image.png

2.第二步==========

新建变量,我们的目的是让变成

image.png

此时我们先明确,肯定是有for()循环遍历,num会++,我们就是要探究for(let i=什么;i<=还是>=什么;i++还是i--),无非就两种方向, 而且这个东西还跟n有关 此时答案呼之欲出 如果还不懂没关系,直接先看看有没有办法写一半 1234肯定能写出来 就是 for(let i=0;i<n;i++){ matrix[0][i]=num++ }

image.png 完成四分之一了吗?

那4567有没有办法呢?
for(let i=0;i<n;i++){ matrix[i][3]= num++ } 我们发现只要让每一列的第三项都递增就好了,这个时候变成num++ 因此我们发现要存一个变量num记录一下++的规律 let num=1(一开始的时候),matrix[][]=num++

image.png 变成了这样 8910同理 for(let i=2;i>=0;i--){ matrix[3][i]= num++ }

image.png 1112也是 for(let i=2;i>=1;i--){ matrix[i][0]= num++ }

image.png

还能做13 14吗? for(let i=1;i<n-1;i++){ matrix[1][i]=num++ }

image.png 此时我们发现一个规律,就是13,14和1234很像

image.png

i一开始不一样,取决于离左边有多远,那么我们就可以有变量let left = 0 i<也不一样,取决于离右边有多远,变量let right = n,n是4个的话,那么刚好是第一第二项 或者我们的<也可以改成<=,让let right - n-1,这样统一起来

image.png 这样我们变量就有了 let left= 0 let right = n-1 let top = 0 let bottom =n-1 let num = 1 还有一个,我们发现会有四种情况对应不同的遍历num++ 因此 我们应该用四种if()某种条件下,对应四种情况 并且到头会改变这个变量 let dir = "left" 这时,我们用一个字符串说明方向,就得到这种情况 这要我们每次遍历后,dir="bottom"改变方向,继续遍历,同时还要记得top++,加上一个1,因为第一次1234头部用完后,top会少一个,这个对于我们做11,12的时候很重要,不会变成11,12,13覆盖掉原来1, “dir”为“top”的时候的情况 for (let i = bottom; i >= top; i--) { matrix[i][left] = num++ } left++ dir = "right"

那个上下左右会一直轮回,我们就用while(条件){轮回} 那什么时候可以轮回呢?我们知道top,left会一直加,bottom,right会一直减,因此我们就让它 top>=bottom&&left>=right,才能继续轮回 如果有一天top++或者bottom--,bottom比top还大,那就不走了,所有应该执行完了。

大家最后要自己写一遍,肯定有很多细节错误的,记录下来,下次争取不犯错不踩坑,有什么不懂问问gpt哈哈哈!! 这是超基础详解了,觉得有用点个赞吧!!

委托结束,又是愉快的一天!!!下线!!