【2025刷题笔记】- VLAN资源池

刷题笔记合集🔗

VLAN资源池

问题描述

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

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

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

输入格式

第一行为字符串格式的 资源池。

第二行为业务要申请的 的取值范围为 之间的整数。

输出格式

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

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

样例输入

1-5
2
20-21,15,18,30,5-10
15
5,1-3
10

样例输出

1,3-5
5-10,18,20-21,30
1-3,5

数据范围

样例 解释说明
样例1 原VLAN资源池中有VLAN 1、2、3、4、5,从资源池中移除2后,剩下VLAN 1、3、4、5,按照题目描述格式并升序后的结果为1,3-5。
样例2 原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。
样例3 原VLAN资源池中有VLAN 1、2、3,5,申请的VLAN 10不在原资源池中,将原资源池按照题目描述格式并按升序排序后输出的结果为1-3,5。
  • 输入VLAN资源池中VLAN的数量取值范围为间的整数
  • 资源池中VLAN不重复且合法(之间的整数)
  • 输入是乱序的

题解

这道题目的核心任务是处理一个特殊格式的VLAN资源池,并从中移除指定的VLAN。

解题思路分为几个关键步骤:

  1. 解析资源池:首先需要将输入的VLAN资源池字符串转换为内部表示形式,可以是一个集合或有序列表,便于操作。

    • 需要处理形如"1-5"的连续VLAN范围
    • 需要处理单个数字"15"的情况
  2. 从资源池中移除申请的VLAN:

    • 如果VLAN存在于资源池中,将其移除
    • 如果不存在,则保持资源池不变
  3. 将处理后的资源池转换回指定格式:

    • 要按照VLAN ID升序排列
    • 连续的VLAN用"开始-结束"表示
    • 不连续的用单个数字表示
    • 用逗号连接各部分

处理连续范围"开始-结束"时的几种情况尤为关键:

  • 当要移除的VLAN位于范围边界时(如:从"1-5"中移除1或5)
  • 当要移除的VLAN位于范围中间时(如:从"1-5"中移除3),会将一个范围分裂成两个范围

实现时可以先将所有VLAN转换为单个数字列表,移除目标VLAN后,再重新构建范围表示。这样处理逻辑会更加清晰。

时间复杂度为O(n),其中n是资源池中VLAN的数量。空间复杂度也是O(n),主要用于存储资源池中的VLAN。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 解析输入
pool_str = input()
remove_vlan = int(input())

# 将VLAN资源池转换为数字集合
def parse_pool(pool_str):
    vlans = set()
    for item in pool_str.split(','):
        if '-' in item:
            start, end = map(int, item.split('-'))
            for vlan in range(start, end + 1):
                vlans.add(vlan)
        else:
            vlans.add(int(item))
    return vlans

# 将数字集合转换回VLAN资源池格式
def format_pool(vlans):
    if not vlans:
        return ""
    
    # 排序VLAN列表
    vlan_list = sorted(list(vlans))
    
    # 构建结果字符串
    ranges = []
    start = vlan_list[0]
    end = start
    
    for i in range(1, len(vlan_list)):
        if vlan_list[i] == end + 1:
            end = vlan_list[i]
        else:
            # 处理连续范围或单个值
            if start == end:
                ranges.append(str(start))
            else:
                ranges.append(f"{start}-{end}")
            start = end = vlan_list[i]
    
    # 处理最后一个范围
    if start == end:
        ranges.append(str(start))
    else:
        ranges.append(f"{start}-{end}")
    
    return ','.join(ranges)

# 主处理逻辑
vlans = parse_pool(pool_str)
if remove_vlan in vlans:
    vlans.remove(remove_vlan)

print(format_pool(vlans))
  • Cpp
#include <bits/stdc++.h>
using namespace std;

// 解析VLAN资源池字符串为数字集合
set<int> parsePool(const string& poolStr) {
    set<int> vlans;
    stringstream ss(poolStr);
    string item;
    
    // 按逗号分割
    while (getline(ss, item, ',')) {
     

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

2025-12-15 11:27
门头沟学院 Java
哇哇的菜鸡oc:所有人不要理会,就好了,后面他就知道怎么回事了,只能说有的时候市场都是被宰的人搞坏的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务