当前位置: 首页 > 科技观察

一道字节笔试题,没想到考...

时间:2023-03-20 01:06:06 科技观察

大家好,我是天天。分享的内容是字节的笔试题和字节的算法题。考察要点可以概括为深度优先遍历,或者说脑筋急转弯。题目目标给定一个包含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=0&&nextY=0&&!isCheckMatrix[nextX][nextY]){dfs(nextX,nextY,directionIndex)}//剩余的directionIndex=(directionIndex+1)%4;}};dfs(0,0,0);returnresult};这里需要对方向做余数处理。在确实只有四个方向的情况下,如果这个方向走不了,就去尝试下一个方向。directionIndex=(directionIndex+1)%4;优化完成后,我想能不能优化一下,做一个分支缩减过程。后来发现,如果当前位置可以走,是不是可以不去判断其他方向了。也就是说,我们可以提前跳出这个循环,这里做的优化就是返回当前的处理。代码: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]=truefor(leti=0;i<3;i++){constnextX=x+dx[directionIndex]constnextY=y+dy[directionIndex]if(nextX=0&&nextY=0&&!isCheckMatrix[nextX][nextY]){returndfs(nextX,nextY,directionIndex)}directionIndex=(directionIndex+1)%4;}};dfs(0,0,0);returnresult};后记后发现这是一道leetcode中级题。题目链接:螺旋矩阵:https://leetcode-cn.com/problems/spiral-matrix/