每日一道算法题 3(2023-12-11)

题目描述:

      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资源池升序排序后的字符串即可。

备注:

输入VLAN资源池中VLAN的数量取值范围为[2-4094]间的整数,资源池中VLAN不重复且合法([1,4094]之间的整数),输入是乱序的。

示例

输入: 1-5         

             2

输出: 1,3-5

说明: 原VLAN资源池中有VLAN 1、2、3、4、5,从资源池中移除2后,剩下VLAN 1、3、4、5,按照题目描述格式并升序后的结果为1,3-5。

输入: 20-21,15,18,30,5-10       

                15

输出: 5-10,18,20-21,30

说明: 原VLAN资源池中有VLAN 5、6、7、8、9、10、15、18、20、21、30,从资源池中移除15后,资源池中剩下的VLAN为 5、6、7、8、9、10、18、20、21、30,按照题目描述格式并升序后的结果为5-10,18,20-21,30。

输入: 5,1-3 10

输出: 1-3,5

说明: 原VLAN资源池中有VLAN 1、2、3,5,申请的VLAN 10不在原资源池中,将原资源池按照题目描述格式并按升序排序后输出的结果为1-3,5。

java 程序

package com.tarena.test.B10;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.StringJoiner;
import java.util.stream.Collectors;

/**
 * 
 
题目描述:

      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资源池升序排序后的字符串即可。

备注:

输入VLAN资源池中VLAN的数量取值范围为[2-4094]间的整数,资源池中VLAN不重复且合法([1,4094]之间的整数),输入是乱序的。

示例

输入: 1-5         

             2

输出: 1,3-5

说明: 原VLAN资源池中有VLAN 1、2、3、4、5,从资源池中移除2后,剩下VLAN 1、3、4、5,按照题目描述格式并升序后的结果为1,3-5。

输入: 20-21,15,18,30,5-10       

                15

输出: 5-10,18,20-21,30

说明: 原VLAN资源池中有VLAN 5、6、7、8、9、10、15、18、20、21、30,从资源池中移除15后,资源池中剩下的VLAN为 5、6、7、8、9、10、18、20、21、30,按照题目描述格式并升序后的结果为5-10,18,20-21,30。

输入: 5,1-3 
      10

输出: 1-3,5

说明: 原VLAN资源池中有VLAN 1、2、3,5,申请的VLAN 10不在原资源池中,将原资源池按照题目描述格式并按升序排序后输出的结果为1-3,5。
 * @author Administrator
 *
 */
public class B13 {
    
    
    public static void main(String[] args) {
        try(Scanner sc = new Scanner(System.in);){
            String vlans = sc.nextLine();
            Integer need = Integer.parseInt( sc.nextLine());
            System.out.println(resultStr(vlans,need));
        }
    }
    
    public static String resultStr(String vlans,Integer need) {
        String[] vlanStr = vlans.split(",");
        LinkedList<Integer[]> list = Arrays.stream(vlanStr).map(
                temp->Arrays.stream(temp.split("-")).map(Integer::parseInt).toArray(Integer[]::new))//
        .sorted((a,b)-> (a[0] - b[0]) )
        .collect(Collectors.toCollection(LinkedList::new));
        for(int i=0;i<list.size();i++) {
            Integer[] tempArr = list.get(i);
            if(tempArr.length==1) {
                if(tempArr[0]==need) {
                    list.remove(i);
                    break;
                }
            }else {
                //比结尾大。结束本次循环
                if(need>tempArr[1]) {
                    continue;
                }
                //比开始小,结束本次循环,而且需要的数不存在
                if(need<tempArr[0]) {
                    break;
                }
                //结尾的值
                if(need==tempArr[1]) {
                    list.set(i, newArray(tempArr[0],tempArr[1]-1));//List 的set 方法与add方法这里可以变换使用。如果用add,前面要先调用删除 remove(i);
                //开始的值    
                }else if(need==tempArr[0]){
                    list.set(i, newArray(tempArr[0]+1,tempArr[1]));
                }else {
                    //list.remove(i);
                    //先添加后面的数组
                    list.set(i, newArray(need+1,tempArr[1]));
                    //再添加前面的数组,刚添加的数组自动向后一位
                    list.add(i, newArray(tempArr[0],need-1));
                }
                break;
            }
        }
        //拼接字符串处理类
        StringJoiner returnStr = new StringJoiner(",");
        list.stream().map(arr ->
            { if(arr.length>1) {//这一块有人也是用的 StringJoiner 来实现 大家觉得哪种方式好呢;
                            return arr[0]+"-"+arr[1];
                            }else {
                                return arr[0]+"";
                            }
                    }
        ).forEach(returnStr::add);//temp1 -> returnStr.add(temp1)
        return returnStr.toString();
    }

    public static Integer[] newArray(Integer begin,Integer end) {
        if(begin < end) {
            return new Integer[] {begin,end};
        }else {
            return new Integer[] {begin};
        }
    }
}
了解知识点

1、StringJoiner 类,之前自己写过类似的功能类,但是不知道java自带的这个类;

2、Arrays 感觉很久没有用这个工具类,专门处理数组的类

3、Stream 流的使用 里面的.map(), .sort(),.collect()等发放使用还有.forEach等方法

相关推荐

  1. 每日算法 3(2023-12-11

    2023-12-10 18:32:01       27 阅读
  2. 每日算法 14(2023-12-22)

    2023-12-10 18:32:01       29 阅读
  3. LeetCode 每日 2023/12/11-2023/12/17

    2023-12-10 18:32:01       42 阅读
  4. LeetCode 每日 2023/12/4-2023/12/10

    2023-12-10 18:32:01       35 阅读
  5. LeetCode 每日 2023/12/18-2023/12/24

    2023-12-10 18:32:01       33 阅读
  6. 每日算法 1

    2023-12-10 18:32:01       37 阅读
  7. 2023.12.16力扣每日

    2023-12-10 18:32:01       44 阅读
  8. 2023.12.17力扣每日

    2023-12-10 18:32:01       45 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 18:32:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 18:32:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 18:32:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 18:32:01       18 阅读

热门阅读

  1. 模电第一章-电路基本概念以及基本定律

    2023-12-10 18:32:01       38 阅读
  2. 笙默考试管理系统-MyExamTest----codemirror(51)

    2023-12-10 18:32:01       34 阅读
  3. “==”和“equals”的区别

    2023-12-10 18:32:01       42 阅读
  4. vscode插件webview和插件通信

    2023-12-10 18:32:01       41 阅读
  5. 大模型应用_chatgpt-on-wechat

    2023-12-10 18:32:01       39 阅读
  6. ESP32网络编程-OTA方式升级固件(基于Web浏览器)

    2023-12-10 18:32:01       38 阅读
  7. 如何选择Docker基础镜像

    2023-12-10 18:32:01       27 阅读
  8. 代码随想录 70. 爬楼梯

    2023-12-10 18:32:01       31 阅读
  9. 【前端设计模式】之责任链模式

    2023-12-10 18:32:01       48 阅读
  10. SAP-PP:超实用的表PP顾问必备

    2023-12-10 18:32:01       32 阅读