大家好,我是天天。分享的内容是字节的笔试题和字节的算法题。考察要点可以概括为深度优先遍历,或者说脑筋急转弯。题目目标给定一个包含mxn个元素(m行,n列)的矩阵,请按顺时针螺旋顺序返回矩阵中的所有元素。输入:[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]基本思想顶上包围的思路是:逐层向内处理,按顺时针顺序遍历:上、右、下、左。其实很像走迷宫的方式。走到格子后,判断是否可以走下一个格子,这就是边界条件。遇到边界条件后,按照上面的顺序:上、右、下、左。所以我们可以有几个约束条件:是否在这个范围内,不能超过这些范围。你有没有走过这个网格,并保存之前的状态。记录当前方向并保持下一个方向是正确的。深度优先遍历是按照深度优先遍历的思想写的。我们可以构造一个通用的dfs模板:constspiralOrder=function(matrix){if(matrix.length===0)return[];constresult=[],dx=[0,1,0,-1],dy=[1,0,-1,0],col=matrix.length,row=matrix[0].length;//isCheckMatrix记录是否constisCheckMatrix=Array.from(newArray(col),()=>(newArray(row).fill(false)))constdfs=(x,y,directionIndex)=>{//逻辑代码//这里一般做逻辑处理,边界处理}};dfs(0,0,0);returnresult};这应该就是基本模板了,唯一不同的是我们看dfs,x,y,directionIndex这三个参数。x和y参数很好理解。directionIndex参数的含义是告诉我们当前的前进方向。接下来,是编写我们的逻辑部分。首先确定接下来走哪个格子:dx=[0,1,0,-1]dy=[1,0,-1,0]constnextX=x+dx[directionIndex]constnextY=y+dy[directionIndex]根据当前格子的位置x和y,我们就知道下一步要去的位置,通过directionIndex的下标索引,我们就知道我们下一个格子的坐标。然后就是判断边界的情况:不能出边界根据上面的信息判断能不能走,其实我们的主要逻辑部分就完成了。代码:constspiralOrder=function(matrix){if(matrix.length===0)return[];constresult=[],dx=[0,1,0,-1],dy=[1,0,-1,0],col=matrix.length,row=matrix[0].length;constisCheckMatrix=Array.from(newArray(col),()=>(newArray(row).fill(false)))constdfs=(x,y,directionIndex)=>{result.push(matrix[x][y])//保存答案isCheckMatrix[x][y]=true//标记通过for(leti=0;i<3;i++){constnextX=x+dx[directionIndex]constnextY=y+dy[directionIndex]//判断边界if(nextX
