Skip to content

Instantly share code, notes, and snippets.

@daniilgrigoryev
Created November 18, 2020 16:58
Show Gist options
  • Save daniilgrigoryev/0f961b535b1611b394c076fff9f2e590 to your computer and use it in GitHub Desktop.
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"];
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);
@octaharon
Copy link

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 отдельных, с другими сигнатурами.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment