华为OD E卷(100分)46-VLAN资源池

前言

工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

VLAN(虚拟局域网)是一种对局域网设备进行逻辑划分的技术。为了标识不同的 VLAN,引入了 VLAN ID 的概念,它是一个介于 1 到 4094 之间的整数。我们定义一个 VLAN ID 的资源池(简称 VLAN 资源池)。在这个资源池中,连续的 VLAN ID 用"开始VLAN-结束VLAN"的格式表示,不连续的用单个整数表示。所有的 VLAN ID 用英文逗号连接起来。

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

输入

输入包含两行:

第一行是一个字符串,表示 VLAN 资源池。

第二行是一个整数,表示业务要申请的 VLAN ID。

输出

输出一行字符串,表示从输入的 VLAN 资源池中移除申请的 VLAN ID 后的资源池。输出要求如下:

满足题目描述中的格式。

按照 VLAN ID 从小到大升序输出。

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

示例

示例1

输入

1-5

2
输出

1,3-5
说明:

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

示例2

输入

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。

示例3

输入

5,1-3

10
输出

1-3,5

说明

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

数据范围

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

题解

Java实现

java 复制代码
package huawei.e100;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

/**
* @author arnold
* @date 2025年1月2日
* VLAN资源池
*/
public class T46 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()) {
			String[] tmp = sc.nextLine().split(",");
			int num = sc.nextInt();
			sc.nextLine();
			Map<Integer, Integer[]>  data = new TreeMap<>();
			for(String d: tmp) {
				if(d.contains("-")) {
					String[] numstrs = d.split("-");
					int start = Integer.parseInt(numstrs[0]);
					int end = Integer.parseInt(numstrs[1]);
					if(start == num) {
						Integer[] v = {start+1, end};
						if((start+1) == end ) {
							v = new Integer[1];
							v[0] = end;
						} 
						data.put(start+1, v);
					} else if(end == num) {
						Integer[] v = {start, end-1};
						if((end-1) == start ) {
							v = new Integer[1];
							v[0] = start;
						} 
						data.put(start, v);
					} else if(start< num && end> num) {
						Integer[] v = {start, num-1};
						if((num-1) == start ) {
							v = new Integer[1];
							v[0] = start;
						} 
						data.put(start, v);
						
						Integer[] v2 = {num+1, end};
						if((num+1) == end ) {
							v2 = new Integer[1];
							v2[0] = end;
						} 
						data.put(num+1, v2);
						
					} else {
						Integer[] v = {start, end};
						data.put(start, v);
					}
				} else{
					Integer id = Integer.parseInt(d);
					if(id != num) {
						Integer[] v = {id};
						data.put(id, v);
					}
				}
			}
			//To String
			final List<String> res = new ArrayList<>();
			data.forEach((k,v) -> {
				if(v.length ==1) {
					res.add(v[0] +"");
				} else {
					res.add(v[0] + "-" + v[1]);
				}
			});
			System.out.println(String.join(",", res));
		}

	}

}
相关推荐
martian66511 分钟前
支持向量机(SVM)深度解析:从数学根基到工程实践
算法·机器学习·支持向量机
孟大本事要学习16 分钟前
算法19天|回溯算法:理论基础、组合、组合总和Ⅲ、电话号码的字母组合
算法
??tobenewyorker1 小时前
力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树
数据结构·c++·算法·leetcode
贾全1 小时前
第十章:HIL-SERL 真实机器人训练实战
人工智能·深度学习·算法·机器学习·机器人
GIS小天2 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年7月4日第128弹
人工智能·算法·机器学习·彩票
满分观察网友z2 小时前
开发者的“右”眼:一个树问题如何拯救我的UI设计(199. 二叉树的右视图)
算法
森焱森3 小时前
无人机三轴稳定化控制(1)____飞机的稳定控制逻辑
c语言·单片机·算法·无人机
循环过三天3 小时前
3-1 PID算法改进(积分部分)
笔记·stm32·单片机·学习·算法·pid
闪电麦坤954 小时前
数据结构:二维数组(2D Arrays)
数据结构·算法
凌肖战4 小时前
力扣网C语言编程题:快慢指针来解决 “寻找重复数”
c语言·算法·leetcode