Created
November 18, 2020 16:58
-
-
Save daniilgrigoryev/0f961b535b1611b394c076fff9f2e590 to your computer and use it in GitHub Desktop.
Merge gap of intervals which has type:array[type:string] ex: let array = ["1-3", "5-7", "2-4", "8-12", "5-11"];
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let array = ["1-3", "5-7", "2-4", "8-12", "5-11"]; | |
let getArrayIntervals = (intervalString) => { | |
let entry = intervalString; | |
let output = entry.map(el => { | |
let result = el.split('-').map((el) => { | |
let item = parseInt(el); | |
return (!isNaN(item) && Math.sign(item)) ? item : false; | |
}); | |
return result; | |
}); | |
return output; | |
}; | |
let getStringIntervals = (intervalArray) => { | |
let entry = intervalArray; | |
let output = entry.map(el => { | |
let result = el.join('-'); | |
return result; | |
}); | |
return output; | |
}; | |
let shortIntervals = (intervals) => { | |
intervals.length <= 1 ? intervals : undefined; | |
let merged = []; | |
let hight = null; | |
intervals = intervals.sort((a, b) => a[0] - b[0]); | |
merged.push(intervals[0]); | |
for (let i = 1; i < intervals.length; i++) { | |
hight = merged[merged.length - 1]; | |
if (hight[1] < intervals[i][0]) { | |
merged.push(intervals[i]); | |
} | |
else if (hight[1] < intervals[i][1]) { | |
hight[1] = intervals[i][1]; | |
merged.pop(); | |
merged.push(hight); | |
} | |
} | |
return merged; | |
} | |
// type:string to type:array | |
let intervalArray = getArrayIntervals(array); | |
// detect gaps of intervals and short array by the logic | |
let merged = shortIntervals(intervalArray); | |
// type:array to type:string | |
let stringInterval = getStringIntervals(merged); | |
console.log(stringInterval); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
7я строка - если уж делать валидацию данных, то стоило бы проверить, что правая граница интервала больше, чем левая. Сама валидация работает некорректно: молча заменяет невалидные значения на false, который попадет во все конечные массивы, должен быть Exception. И, вообще говоря, нигде не было требования, что числа должны быть положительные, в задании написано "целые".
Некорректно работают следюущие кейсы:
[]
['1-a','1-5']
['7-1','1-5']
ну и 0, отрицательные числа и Infinity не поддерживаются.
26я строка - ничего не делает
26-44: алгоритм слияния вызывает вопросы, pop а затем push - зачем, известны же индексы, ну и раз это отдельная функция, она тоже должна быть устойчива к невалидным данным. Ход мысли в целом верный, но можно действовать значительно проще - если левая граница i+1-го интервала входит в текущий, то правая граница текущего интервала заменяется на правую границу i+1-го, иначе i+1й интервал становится добавляется в массив и становится текущим.
47-53: зачем создавать 3 функции, а потом применять их к одной переменной? Не самое лучшее смешение императивного и декларативного стилей. При этом по заданию требовалось сделать функцию сигнатуры string[]=>string[], ее здесь нет, есть только 3 отдельных, с другими сигнатурами.