最近在网上看到这样一道算法面试题:
有一个数组[1,1,1,2,3,4,5,8,10,22,24,25,26,66],请写一个方法把数组变成[1,1,[1,2,3,4,5],8,10,22,[24,25,26],66]
大体思路就是循环遍历,每次遍历判断当前项是否与前一项差值为1,这里需要考虑若结果为1,如何处理,结果不为1如何处理。
结果不为1,我们可以直接将当前项插入结果数组,但是这里我们需要考虑边界问题,我们设置两个变量,第一个变量数组长度len,第二个变量数组遍历开始的位置i,为了方便,我们将i设置为1。
此时代码如下:
var len = arr.length; var res = []; for (var i = 1; i <= len; i++) { // something }
加上判断逻辑:
var len = arr.length; var res = []; for (var i = 1; i <= len; i++) { if(arr[i]-arr[i-1]!==1){ // someting }else{ // someting } }
接下来如何做呢?
我们可以这么干,再次声明一个标记变量j,j的初始值为0;
此时我们再次观察一下需要处理的数组:
[1,1,1,2,3,4,5,8,10,22,24,25,26,66]
通过观察数组我们可以发现,当我们循环遍历每一项,从脚标1开始,如果当前项与前一项的差值不为1,我们可以直接将前一项推入结果数组,并标记此时的i值,即将i值赋值为j来保存。
如果差值等于1,什么也不做,直接跳过,再次观察上面的数组,当判断遇到:”1,2,3,4,5”,这几项时,直接跳过,此时res的结果是[1,1],之后接着循环,当循环遍历判断8-5时,我们需要将1,2,3,4,5作为一个数组整体推入结果数组。
此时发现j的值为2,i的值为7,我们只需要将原数组中第二项到第七项(不包括第七项)截取出来,塞进结果数组,并更新j值。
那么在代码中执行时,何时塞入当前项(前一项),何时塞入截取的的数组呢?可以根据i和j的差值来判断,若i-j的差值大于一,则截取原数组j到i的结果塞入结果数组,代码如下:
var arr = [1,1,1,2,3,4,5,8,10,22,24,25,26,66] var len = arr.length var i = 1, j = 0 var rst = [] for(; i <= len; i++) { if(arr[i]-arr[i-1] !== 1) { i-j===1 ? rst.push(arr[j]) : rst.push(arr.slice(j, i)) j = i } } console.log(rst);
代码里用到了一个三元运算符,通过判断i与j的差值来判断向数组中塞入何值。
代码流程图:
这里需要理解的是j值的使用方式,用j来标记数组项时候连续。
本文分享自微信公众号 - nodejs全栈开发(geekclass),作者:挥刀北上
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2019-02-18
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句