一个数字段由首尾两个数字标识,表示一个自然数集合,
比如数字段[beg, end)表示从beg到end之间的所有自然数,
包含beg,但不包含end。
有若干个数字段,这些数字段之间可能有重叠,
怎么把这些数字段合并去重,用最少个数的数字段来表示。
合并前后,整个集合包含的数字不发生变化。
第一行为数字N,表示接下来有N个数字段(N<=100000)
第二行开始一共有N行,每行两个数字,分别表示一个数字段的beg和end
(beg和end为无符号32位整数)
合并去重后形成的数字段集合,按升序排列。
4 3 8 3 7 4 6 7 9
3 9
process.stdin.resume();
process.stdin.setEncoding('ascii');
var input = "";
process.stdin.on('data', function (data) {
input += data;
});
process.stdin.on('end', function () {
var input_array = input.split("\n");
//示例代码
var len = input_array.length;
var result = [];
var len1 = Number(input_array[0])
for(let i=1; i<len; i++){
let first = Number(input_array[i].split(' ')[0])
let second = Number(input_array[i].split(' ')[1])
for(let i=first;i<second;i++){
result.push(i)
}
}
let newArr = Array.from(new Set(result)).sort((a, b) => a - b)
let finalStr = `${newArr[0]}`
for (let i = 1; i < newArr.length; i++) {
if (newArr[i] != newArr[i - 1] + 1) {
finalStr += (`${' ' + (newArr[i - 1] + 1)}\n${' ' + (newArr[i] + 1) - 1}`)
}
}
console.log(`${finalStr} ${newArr[newArr.length - 1] + 1}`)
return `${finalStr} ${newArr[newArr.length - 1] + 1}`
})
内存超了,我泪目了