华为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));
		}

	}

}
相关推荐
Octopus20776 分钟前
链地址法(哈希桶)
c++·笔记·学习·算法·哈希算法
Cedric_Anik16 分钟前
数据结构——二叉树
数据结构·算法
KeyPan27 分钟前
【数据结构与算法:八、排序】
开发语言·数据结构·人工智能·后端·算法·排序算法·scala
看星猩的柴狗35 分钟前
密码学原理技术-第十一章-Hash Functions
算法·密码学·哈希算法
XWXnb644 分钟前
数据结构:树
数据结构·算法
cloud___fly1 小时前
力扣hot100——动态规划 & 多维动态规划
算法·leetcode·动态规划
冠位观测者1 小时前
【Leetcode 热题 100】74. 搜索二维矩阵
数据结构·算法·leetcode
初学者丶一起加油1 小时前
C语言基础:指针(常量指针和指针常量)
java·linux·c语言·开发语言·算法·ubuntu·visualstudio
想要AC的sjh1 小时前
【Leetcode】2274. 不含特殊楼层的最大连续楼层数
c++·算法·leetcode·职场和发展