范围提取(编程题)
描述:(JavaScript解决)
给定一个升序数组,在超过连续的3个数时进行范围提取,如[1,2,3],则返回"1-3"最后返回一个字符串,例如给定:[-5,-4,-3,-2,1,2,3,4,6,7,9,10,11,12,16,18,19,20,21,22],则返回字符串“-5 - -2,1-4,6,7,9-12,16,18-22,”,又如[1,2,5,7,8,10],则返回“1,2,5,7,8,10”。
思路:
用一个开始标记start记录开始数字位置,用一个长度标记numlong记录循环后的长度,当遍历循环时出现不连续,则进行判断,如果这时候的长度大于等于3,则进行范围提取,然后开始标记start重设为当前数字位置,长度标记设为0,如果长度小于3,则进行数字拼接,用一个while循环拼接。最后判断最后一个字符。
代码:
let fun = (arr) =>{
let len = arr.length //输入数组的长度
let result = "" //输出结果字符串
let start = arr[0] //开始的字符串
let numlong = 0 //记录每一次的长度
let flag = false //标记位,解决最后一个数问题
for(let i=1; i < len; i++) {
numlong++
//当出现不连续时的情况,进行判断
if(((start+numlong) != arr[i] ) || (i == len - 1)) {
//解决最后一个的问题判断
if((arr[len-1] == arr[len-2] + 1) && (i == len - 1)) {
numlong ++
flag = true
}
//当出现连续超过3个时
if(numlong >= 3) {
let count = start + numlong - 1
result += "" + start + "-" + count +","
//初始化
start = arr[i]
numlong = 0
} else {
//未出现3个连续的情况,直接拼接
while(numlong > 0) {
result += "" + arr[i-numlong] + ","
numlong--
}
//初始化
start = arr[i]
}
}
}
//判断最后一个数
if (!flag) {
result += "" + arr[len-1]
}
console.log(result)
}
// let s = [1,2,5,7,8,10]
let s = [-5,-4,-3,-2,1,2,3,4,6,7,9,10,11,12,16,18,19,20,21,22]
fun(s)