华为机试:VLAN

题目描述:
VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。

定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单个整数表示,所有的VLAN用英文逗号连接起来。

现在有一个VLAN资源池,业务需要从资源池中申请一个VLAN,需要你输出从VLAN资源池中移除申请的VLAN后的资源池。

输入描述:
第一行为字符串格式的VLAN资源池,第二行为业务要申请的VLAN,VLAN的取值范围为[1,4094]之间的整数。

输出描述:
从输入VLAN资源池中移除申请的VLAN后字符串格式的VLAN资源池,输出要求满足题目描述中的格式,并且按照VLAN从小到大升序输出。

如果申请的VLAN不在原VLAN资源池内,输出原VLAN资源池升序排序后的字符串即可。
 

public static void main(String[] args) {
    System.out.println("请输入两行VLAN");
    Scanner in = new Scanner(System.in);
    String vlanResouce = in.nextLine();
    String reqVlan = in.nextLine();
    //拆分资源
    String[] valns = vlanResouce.split(",");
    List<Integer> valnList = new ArrayList<>();
    for (int i = 0; i < valns.length; i++) {
        if (valns[i].contains("-")){
            String[] valnArr = valns[i].split("-");
            int count = 1;
            int beginValn =Integer.parseInt(valnArr[0]);
            int endValn =Integer.parseInt(valnArr[1]);
            valnList.add(beginValn);
            valnList.add(endValn);
            while (beginValn+count<endValn) {
                valnList.add(beginValn + count);
                count++;
            }
        }else{
            valnList.add(Integer.parseInt(valns[i]));
        }
    }
    //排序资源
    valnList.sort(Comparator.comparingInt(o -> o));
    //剔除资源
    Integer req  = Integer.parseInt(reqVlan);
    valnList.remove(req);
    //重新编码资源
    int beginIndex = 0;
    Integer keepBegin = null;
    int endIndex = 1;
        int count =0;
    while (beginIndex<=endIndex && endIndex<valnList.size()){
        Integer beginV = valnList.get(beginIndex);
        Integer endV = valnList.get(endIndex);
        //不连续输出首个
        if (endV != beginV+1 && keepBegin == null){
            System.out.print(beginV+",");
            beginIndex = endIndex;
            endIndex++;
        }else{
            //开始连续
                //记录首次开始连续的位置
            keepBegin = beginIndex;
            Integer keepBeginV = valnList.get(keepBegin);
            while(endIndex <valnList.size()){
            Integer nextEndV = valnList.get(endIndex);
            if (nextEndV-keepBeginV != endIndex -keepBegin ){
                endV = valnList.get(endIndex-1);
                System.out.print(keepBeginV+"-"+endV+",");
                beginIndex = endIndex;
                endIndex++;
                keepBegin =  null;
                break;
            }
            endIndex++;
            }
            if (endIndex ==valnList.size()){
                Integer nextEndV = valnList.get(endIndex-1);
                if (keepBegin ==null){
                    System.out.print(nextEndV);
                }else{
                    System.out.print(keepBeginV+"-"+nextEndV);
                }
                break;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值