序
JavaScript中的array对象,我们通常称之为Array对象,主要用于封装和管理多种任意类型的数据。
所有主要浏览器都支持数组对象。
大家都知道Array实例有这四种方法:推送、弹出、移位和卸载。大家都知道push pop实现栈,shift push实现队列。我们这里不讨论任何先进先出。
但另一方面,这些方法将用于这个问题。
科目
螺旋矩阵这个术语在背景语言中可能很熟悉。它是一个二维数组。它的特点是什么?请看下图:
上面是一个从外到内的螺旋矩阵。他的排列规则是从外围开始,绕着最里面的一圈又一圈,就像一条盘旋的蛇。
分析和解决方案
言归正传,今年9月,腾讯网笔考试出现了螺旋矩阵。引入给定数N,打印出n*n的螺旋矩阵。当时新手没做成。过了一段时间,他在电脑上思考,突然意识到了这个秘密。
虽然当时博主没有记录代码,但是我先定义了一个n*n的二维数组,得到了几个要缠绕的层,比如上面的两层,然后循环了几次,里面用了四个for循环,分别是从上到下,从左到右插入定义的二维数组的内容,具体代码无法使用。反正方法很蠢,也不是本文的重点。让我们进入本章的主题:
前几天我在做一个关于codewars的问题,遇到一个螺旋矩阵的问题,需要写一个函数,给一个矩阵二维数组参数,返回一个数组,数组的元素顺序是螺旋矩阵的路径。
例如:
函数getLinear(螺旋){//.做某事} var arr=[[1,2,3],[4,5,6],[7,8,9]]getLinear(arr)//返回[1,2,3,6,9,8,8]
第一次看到这个问题,想起了腾讯招聘的那个问题,然后博主用四个相似的for loops写了出来,提交了。这个网站的一个功能是,当你完成题目的时候,你可以阅读别人的代码。博主们小心翼翼地点击答案列表。哇,第一个深深吸引了我。虽然不记得别人写的源代码,大致是这样的:
函数getLinear(螺旋){ var itemVar linear=[] while (item=螺旋形。shift()){//上线性=linear . concat(item)//right for(var I=0;长度螺旋;I) {linear.push(螺旋[I]。pop())}//low linear=linear . concat(spiral . pop()。reverse())//left for(var I=spiral . length-1;I=0;I-){线性。推(螺旋[I]。shift ())}} return linear}对于新手级别的我来说,刚开始有点迷茫,因为和我的思维不一样,看了一会就发现了其中的奥秘。与我写的相比,这段代码不需要考虑传入的数组是否为n*n,可以解析任何数组,比如2*3数组。
而且代码绝对简洁,有一定基础的人很容易理解。
如果你有点困惑,就往下看,用我的图文解释一下
//upper linear=linear . concat(item)item是二维数组的第一个元素,也就是第一个数组。将其从阵列中取出,并按如下方式返回:
在这一行代码之后,原始数组变成如下:
接下来,我们需要在要返回的数组中添加5 6 7,也就是二维数组中每个数组元素的最后一个元素,我们可以通过pop得到:
//右为(var I=0;长度螺旋;I){线性。推(螺旋[I]。pop ())}这时,原来的二维数组变成如下:
接下来,我们必须得到最后一行10 9 8并反转它,从最后一个数组中弹出二维数组,然后反转它
//在linear下=linear.concat (spiral.pop()。reverse()),原来的二维数组是这样的:
得到左边的和得到右边的相似,只是把pop改成shift:
//左为(var I=spiral . length-1;I=0;I-){线性。推(螺旋[I]。shift ())}原始二维数组变成:
此时,一圈结束,然后一边判断是否进入下一圈。
摘要
好了,这篇文章的内容就到这里。一个看似简单的话题,在Array的灵活性下变得如此简单。希望本文的内容对所有js新手有所帮助。有问题可以留言交流。