每天一道算法题(五)——判断一组数字是否连续,出现连续数字的时候以‘-’输出
文章目录
- 1、问题
- 2、示例
- 3、解决方法
- (0)错误示范——两个for循环遍历
- (1)方法1(递归)
- (2)方法2(推荐)
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);