javascript之活灵活现的Array
前言
就如同标题一样,这篇文章将会灵活的运行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相关推荐
- Javascript语言精粹之Array常用方法分析
Javascript语言精粹之Array常用方法分析 1.Array常用方法分析 1.1 Array.prototype.sort() Javascript的默认比较函数假定被排序元素都是字符串,所以 ...
- JavaScript 新提案:array.groupBy()
作者:Ashish Lahoti 译者:前端小智 来源:dmitripavlutin 有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://gi ...
- 厉害了,JavaScript 新提案:array.groupBy()
作者:Ashish Lahoti 译者:前端小智 来源:dmitripavlutin 许多开发人员喜欢 Ruby 编程语言,因为它具有丰富的标准实用程序库.例如,Ruby中的数组有大量的方法. 不过, ...
- Javascript学习总结三(Array对象的用法)
javascript Array对象的常用API 1:concat concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 举例: var a1 ...
- JavaScript的json和Array及Array数组的使用方法
1.关于json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集.也可以称为数据集和数组类似,能够存数据! //Ar ...
- javascript数组降维_js Array数组实用操作大全(≈28条)不定期更新
来源:(更新:2019-12-26)https://github.com/renzhezhilu/Blog/blob/master/javaScript/jsAdvanced/Array%E6%93% ...
- [导入]ASP.NET AJAX 说明文档-客户端引用-全局命名空间-JavaScript 基础类型扩展-Array 类型扩展-add 函数...
Array.add 函数.将元素添加到 Array 的结尾处. 本函数是静态函数,使用时无需实例化.语法Array.add(array, 文章来源:http://blog.csdn.net/chswo ...
- [导入]ASP.NET AJAX 说明文档-客户端引用-全局命名空间-JavaScript 基础类型扩展-Array 类型扩展-contains 函数...
Array.contains 函数.使用 contains 函数确定某元素是否在 Array 中.在Firefox浏览器中 调用 contains 函数 如果数组中有元素被设置为 undefined且 ...
- 【JavaScript】JS的Array的用法总结
目录 Array的长度相关问题 indexOf取元素下标 slice操作 push和pop操作 unshift和shift操作 sort操作 reverse操作 spilce操作 concat函数 j ...
最新文章
- OpenCV rectangle
- 主人的C++桌上也没有这么好看的花朵了
- Hive之管理表 外部表 分区表
- Java 多线程 - 线程 - 守护线程
- linux执行定时,linux定时执行 - 乄珍惜
- Linux安装redis及redis的php扩展。
- 学习libpcap库,写例子代码--tcp_config.txt
- 我的开发环境配置经验
- 世界第一黑客:凯文.米特尼克
- android 多个基站信息吗,Android模拟器模拟基站信息,并将wifi伪造成4g数据信息
- [技术分享 – FCS 篇] 驭龙五式3之飞龙在天:安装 FCS 服务器
- 微信指纹java.lang_微信小程序调用指纹验证
- 实验五 FBG团队亮相
- 为什么招聘单位都要求你有ITIL证书,你知道吗?
- Bing翻译实例(microsoft translator API)
- 如何实现 一个系统去调用另一个系统的接口
- 河南省第 10 届 ACM 竞赛总结(附榜单)
- DA18B20 MSP430单片机程序
- 商户后台返回数据签名错误_微信小程序 用户信息开放数据校验与解密
- 保姆级丨Mesos Marathon部署
热门文章
- 不小心将 U 盘抹成 APFS 格式,应该如何恢复?
- DDraw笔记-高彩模式
- 高维数组matlab,MATLAB 高维数组
- 大数据周会-本周学习内容总结0102
- 郭国骥课题组《Nature communications》发表非洲爪蟾单细胞图谱并解析变态发育过程的调控机制...
- 算法--01背包问题(动态规划算法)	21-01-30
- 大数据进阶之路——Spark SQL 之 DataFrameDataset
- 开机后黑屏看不到桌面_开机后黑屏看不到桌面怎么解决
- eLife | 利用进化信息预测蛋白质界面间残基-残基相互作用
- 【Linux练习生】进程间通信