Javascript每天一道算法题(五)——判断一组数字是否连续,出现连续数字的时候以‘-’输出


1、问题

实现一个函数,判断一组数字是否连续。当出现连续数字的时候以‘-’输出。

2、示例

如: const arr = [ 2, 3, 4, 7, 8, 9, 10,13,15,16]
期望结果:[“2-4”, “7-10”, 13, 15-16]

3、解决方法

(0)错误示范——两个for循环遍历

如果第n项-n+1项 == 1说明连续,就返回连续的值,但是这样无法输出7-10这种多个连续的数据,只能输出2-4这种单个连续的数据。如果使用 for循环需要定义来获取初始值(获取7-10中的10)。可惜的是我依旧没有写出这种写法。

(1)方法1(递归)

const arr = [ 2, 3, 4, 7, 8, 9, 10,13,15,16]
const newArr = [];
function getArray(arr, index, target) {
    if (!arr.length) return
    const item = arr[index]
    const item2 = arr[index+1]
    if (item + 1 !== item2) {
        if (target) {
            newArr.push(`${target}-${item}`)
            getArray(arr.slice(index+1), 0)
        } else {
            newArr.push(item)
            getArray(arr.slice(1), 0)
        }
    } else {
        getArray(arr, index+1, target || item)
    }
}
getArray(arr, 0)
console.log(newArr)

(2)方法2(推荐)

const arr = [ 2, 3, 4, 7, 8, 9, 10,13,15,16]
function getArray(arr){
    var start= '' // 1:存储第一项的数据
    var newArr = [] // 2: 存储返回的新数据
    arr.forEach((item,index)=>{
        // 3。1:第一项+1 == 第二项   并且  第一项-1 != 第0项
        if(item + 1 == arr[index+1] && item -1 != arr[index-1]){
            // 说明左边不连续,右边连续,也就是第一项
            start = item
        } else if(item + 1 != arr[index+1] && item -1 == arr[index-1]){
            // 3.2:item+1不等于item的后一项 并且 item-1等于item的前一项
            // 说明当前遍历的第一项(start)和当前item是连续的,但是和后面一项不连续(相当于7-10的10)
            // 关键点:如果是7-10的话,中间的8、9都没有进行对比,直接不管这步,将返回的前后控制好就有效果
            newArr.push(start + '-' + item)
        }else if(item + 1 != arr[index+1] && item -1 != arr[index-1]){
            // 3.3:item+1不等于item的后一项 并且 item-1不等于item的前一项
            // 说明当前的item值和前一项后一项都不连续,所以单独加入(相当于示例的13)
            newArr.push(item)
        }
    })
    console.log(newArr);
}
getArray(arr);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值