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

	}

}
相关推荐
Black蜡笔小新3 小时前
自动化AI算法训练服务器DLTM助力医学影像分析进入AI智能分析新时代
人工智能·算法·自动化
手写码匠4 小时前
深入解析大模型架构之争:全能通用模型 vs 领域专精模型
人工智能·深度学习·算法·aigc
浅念-5 小时前
LeetCode 回溯算法题——综合练习
数据结构·c++·算法·leetcode·职场和发展·深度优先·dfs
列星随旋5 小时前
线段树和树状数组的学习
学习·算法
全糖可乐气泡水7 小时前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
h_a_o777oah7 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师7 小时前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
手写码匠9 小时前
Android 17 适配实战指南:新特性解读、隐私变更与迁移全攻略
人工智能·深度学习·算法·aigc
珊瑚里的鱼9 小时前
leetcode42雨水
算法·leetcode