首页 > 试题广场 >

IP段合并

[编程题]IP段合并
  • 热度指数:1475 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
一个数字段由首尾两个数字标识,表示一个自然数集合,
比如数字段[beg, end)表示从beg到end之间的所有自然数,
包含beg,但不包含end。

有若干个数字段,这些数字段之间可能有重叠,
怎么把这些数字段合并去重,用最少个数的数字段来表示。

合并前后,整个集合包含的数字不发生变化。



输入描述:
第一行为数字N,表示接下来有N个数字段(N<=100000)
第二行开始一共有N行,每行两个数字,分别表示一个数字段的beg和end
(beg和end为无符号32位整数)


输出描述:
合并去重后形成的数字段集合,按升序排列。
示例1

输入

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}`
})


内存超了,我泪目了
发表于 2020-09-10 11:34:41 回复(0)