题目0042

Vlan是一种为局域网设备进行逻辑划分的技术
为了标识不同的vlan 引入了vlan id 1~4094之间的整数
定义一个vlan id 的资源池
资源池中连续的vlan用开始vlan-结束vlan表示,
不连续的用单个整数表示
所有的vlan用英文逗号连接起来
现有一个vlan资源池,业务需要从资源池中申请一个vlan
需要你输出从vlan资源池中移除申请的vlan后的资源池

输入描述
第一行为字符串格式的vlan资源池
第二行为业务要申请的vlan vlan的取值范围1~4094

输出描述
从输入vlan资源池中移除申请的vlan后
字符串格式的vlan资源池
输出要求满足题目中要求的格式,
并且要求从小到大升序输出
如果申请的vlan不在原资源池,输出升序排序的原资源池的字符串即可

示例一
输入
1-5
2
输出
1,3-5
说明:原vlan资源池中有1 2 3 4 5 移除2后
剩下的1 3 4 5按照升序排列的方式为 1 3-5

示例二
输入
20-21,15,18,30,5-10
15
输出
5-10,18,20-21,30
说明:
原vlan资源池中有5 6 7 8 9 10 15 18 20 21 30
移除15后 剩下的为 5 6 7 8 9 10 18 20 21 30
按照题目描述格式并升序后的结果为5-10,18,20-21,30

示例三
输入
5,1-3
10
输出
1-3,5
资源池中有1 2 3 5
申请的资源不在资源池中
将原池升序输出为1-3,5

输入池中vlan数量范围为2~2094的整数
资源池中vlan不重复且合法1~2094的整数
输入是乱序的

<?php
$s=trim(fgets(STDIN));
$k=trim(fgets(STDIN));
solution($s,$k);

function solution($s,$q)
{
    $pools=explode(',',$s);
    $res=[];
    foreach ($pools as $pool){
        if(strpos($pool,'-')){
            $sp=explode('-',$pool);
            for ($i=$sp[0];$i<=$sp[1];$i++){
                if($q==$i) continue;
                $res[]=$i;
            }
        }else{
            if($q==$pool) continue;
            $res[]=$pool;
        }
    }
    sort($res);
    $start=$end=$res[0];
    $resStr=[];
    for ($i=1;$i<count($res);$i++){
        if($res[$i]==$end+1){
            $end=$res[$i];
        }else{
            if($start==$end) $resStr[]=$start;
            else
                $resStr[]=$start.'-'.$end;
            $start=$end=$res[$i];
        }
    }
    if($start==$end) $resStr[]=$start;
    else
        $resStr[]=$start.'-'.$end;
    echo implode(',',$resStr);
}

 

posted @ 2022-07-22 16:22  weigm*  阅读(92)  评论(0)    收藏  举报