前言

就如同标题一样,这篇文章将会灵活的运行Array对象的一些方法来实现看上去较复杂的应用。

大家都知道Array实例有这四个方法:push、pop、shift、unshift。大家也都知道 push + pop实现栈, shift + push实现队列。在这里不讨论什么先进后出、先进先出。但一面这个题将要用到这几个方法。

题目

螺旋矩阵这个名词,在后台语言中可能很熟悉,他是个二维数组,他有什么特点呢?请看下图:

以上是一个从外到内的螺旋矩阵,他的排列规则是从外围开始走,一圈一圈绕道最里面,就像一条盘旋着的蛇。

分析与解答

进入正题,今年9月份腾讯校招在线笔试题就有一个螺旋矩阵的 题,传入给定数字n,打印出n*n的螺旋矩阵,当时本菜鸟并没有做出来,时间过后自己在电脑上想,然后恍然大悟明白的其中的奥妙。

虽然博主没有记录当时的代码,但是我是首先定义了个n*n的二维数组,得到需要绕几层,比如上面的是2层,然后就循环几次,在内部用四个for循环,分别是上下左右给定义的二维数组插内容,具体的代码就没法上了,反正方法很笨,而且并不是本文章的重点,下面进入本章主题:

前几天我在codewars上做题,遇到了个螺旋矩阵的题,它是要求写一个函数,给定一个矩阵二维数组参数,返回一个数组,该数组的元素顺序就是螺旋矩阵的路径。

例如:

function getLinear (spiral) {//...做一些操作
}var arr = [[1,2,3],[4,5,6],[7,8,9]
]getLinear(arr)   // 返回 [1,2,3,6,9,8,7,4,5]

上面例子清除的看到getLinear函数是将传入的‘螺旋矩阵’用一维数组按顺序输出了(我也不知道怎么说了,反正就是把这个二维数组像蛇一样盘旋着形成一维数组)

看到这个题的第一时间,我就想起了腾讯校招的那个题, 然后博主就用类似的四个for循环写完了,然后提交。这个网站有个功能是,你做完题目可以看别人做的代码,博主小心翼翼的点开答案列表,哇,第一条就深深吸引了我。虽然不记得别人写的源码,但大致是这样的:

function  getLinear(spiral) {var item;var linear = []while (item = spiral.shift()) {// 上linear = linear.concat(item)// 右for (var i = 0; i < spiral.length; i++) {linear.push( spiral[i].pop()  )}// 下linear = linear.concat( spiral.pop().reverse())// 左for (var i = spiral.length - 1; i >= 0; i --) {linear.push(spiral[i].shift())}}return linear}

对于菜鸟级别的我来说,刚开始还有点懵,因为跟我的思维不一样,看了一会才发现其中的奥妙。相比我写的真是好多了,这个代码不需要考虑传入的是否为n*n数组,他可以解析任意数组比如2*3数组等。

而且代码绝对简洁,对于有一定基础的来说也很容易懂。

如果你有些困惑,就往下看,我的图文解释

// 上linear = linear.concat(item)

item为二维数组的第一个元素,就是第一个数组,将它移除数组并返回,如下:

此行代码后,原数组变成如下:

接下来,我们需要将 5 6 7 加入要返回的数组中,也就是二维数组的每个数组元素的最后一个元素,我们可以用pop获取到:

// 右for (var i = 0; i < spiral.length; i++) {linear.push( spiral[i].pop()  )}

这时原来的二维数组变成了如下:

接下来我们要拿到最后一行 10 9 8 并倒置,将二维数组pop出最后一个数组然后将他reverse就可以了

// 下linear = linear.concat(spiral.pop().reverse())

此时原来二维数组是这样的:

获取左边的就跟右边类似,只需要将pop变成shift:

// 左
for (var i = spiral.length - 1; i >= 0; i --) {linear.push(spiral[i].shift())
}

原来二维数组变为:

此时,一圈就完了,然后while判断是否进入下一圈。

本章就到这里了,一个看上去不简单的题目,在Array的灵活下变得如此简单,博主忍不住要分享给js新人们。

javascript之活灵活现的Array相关推荐

  1. Javascript语言精粹之Array常用方法分析

    Javascript语言精粹之Array常用方法分析 1.Array常用方法分析 1.1 Array.prototype.sort() Javascript的默认比较函数假定被排序元素都是字符串,所以 ...

  2. JavaScript 新提案:array.groupBy()

    作者:Ashish Lahoti 译者:前端小智 来源:dmitripavlutin 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://gi ...

  3. 厉害了,JavaScript 新提案:array.groupBy()

    作者:Ashish Lahoti 译者:前端小智 来源:dmitripavlutin 许多开发人员喜欢 Ruby 编程语言,因为它具有丰富的标准实用程序库.例如,Ruby中的数组有大量的方法. 不过, ...

  4. Javascript学习总结三(Array对象的用法)

    javascript Array对象的常用API 1:concat concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 举例: var a1 ...

  5. JavaScript的json和Array及Array数组的使用方法

    1.关于json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集.也可以称为数据集和数组类似,能够存数据! //Ar ...

  6. javascript数组降维_js Array数组实用操作大全(≈28条)不定期更新

    来源:(更新:2019-12-26)https://github.com/renzhezhilu/Blog/blob/master/javaScript/jsAdvanced/Array%E6%93% ...

  7. [导入]ASP.NET AJAX 说明文档-客户端引用-全局命名空间-JavaScript 基础类型扩展-Array 类型扩展-add 函数...

    Array.add 函数.将元素添加到 Array 的结尾处. 本函数是静态函数,使用时无需实例化.语法Array.add(array, 文章来源:http://blog.csdn.net/chswo ...

  8. [导入]ASP.NET AJAX 说明文档-客户端引用-全局命名空间-JavaScript 基础类型扩展-Array 类型扩展-contains 函数...

    Array.contains 函数.使用 contains 函数确定某元素是否在 Array 中.在Firefox浏览器中 调用 contains 函数 如果数组中有元素被设置为 undefined且 ...

  9. 【JavaScript】JS的Array的用法总结

    目录 Array的长度相关问题 indexOf取元素下标 slice操作 push和pop操作 unshift和shift操作 sort操作 reverse操作 spilce操作 concat函数 j ...

最新文章

  1. OpenCV rectangle
  2. 主人的C++桌上也没有这么好看的花朵了
  3. Hive之管理表 外部表 分区表
  4. Java 多线程 - 线程 - 守护线程
  5. linux执行定时,linux定时执行 - 乄珍惜
  6. Linux安装redis及redis的php扩展。
  7. 学习libpcap库,写例子代码--tcp_config.txt
  8. 我的开发环境配置经验
  9. 世界第一黑客:凯文.米特尼克
  10. android 多个基站信息吗,Android模拟器模拟基站信息,并将wifi伪造成4g数据信息
  11. [技术分享 – FCS 篇] 驭龙五式3之飞龙在天:安装 FCS 服务器
  12. 微信指纹java.lang_微信小程序调用指纹验证
  13. 实验五 FBG团队亮相
  14. 为什么招聘单位都要求你有ITIL证书,你知道吗?
  15. Bing翻译实例(microsoft translator API)
  16. 如何实现 一个系统去调用另一个系统的接口
  17. 河南省第 10 届 ACM 竞赛总结(附榜单)
  18. DA18B20 MSP430单片机程序
  19. 商户后台返回数据签名错误_微信小程序 用户信息开放数据校验与解密
  20. 保姆级丨Mesos Marathon部署

热门文章

  1. 不小心将 U 盘抹成 APFS 格式,应该如何恢复?
  2. DDraw笔记-高彩模式
  3. 高维数组matlab,MATLAB 高维数组
  4. 大数据周会-本周学习内容总结0102
  5. 郭国骥课题组《Nature communications》发表非洲爪蟾单细胞图谱并解析变态发育过程的调控机制...
  6. 算法--01背包问题(动态规划算法) 21-01-30
  7. 大数据进阶之路——Spark SQL 之 DataFrameDataset
  8. 开机后黑屏看不到桌面_开机后黑屏看不到桌面怎么解决
  9. eLife | 利用进化信息预测蛋白质界面间残基-残基相互作用
  10. 【Linux练习生】进程间通信