Codewar的Range Extraction
描述:
表示正序整数数组使用逗号将任意一个整数分隔开
- 单个整数
- 或者一个整数范围,从开始到结束之间用"-“分隔。范围包括区间内包括两端的所有整数。它只有跨越至少3个数字才能被判定为是一个范围。例如"12,13,15-17”
给出解决方案,使其能接收一个为递增顺序排列的整数数组,并以正序的格式返回格式化正确的字符串。
示例:
solution([-10, -9, -8, -6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]);
// returns "-10--8,-6,-3-1,3-5,7-11,14,15,17-20"
solution([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20]);
// returns "-6,-3-1,3-5,7-11,14,15,17-20"
我的解决方案:
function solution(list) {
// TODO: complete solution
let arr = []
list.map((item, i) => {
if (list[i - 1] + 1 === item && list[i + 1] === item + 1) {
item = '&'
}
arr = [...arr, item]
})
let str = arr.join(',').replace(/(,&,)|(,&)|(&,)/g,'&').replace(/(&)(\1)+/g,'-').replace(/&/g,'-')
return str
}
我认为的最佳方案:
function solution(list){
for(var i = 0; i < list.length; i++){
var j = i;
while(list[j] - list[j+1] == -1) j++;
if(j != i && j-i>1) list.splice(i, j-i+1, list[i] +'-'+list[j]);
}
return list.join();
}