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

	}

}
相关推荐
吃着火锅x唱着歌13 小时前
LeetCode 1128.等价多米诺骨牌对的数量
算法·leetcode·职场和发展
十八岁讨厌编程14 小时前
【算法训练营 · 补充】LeetCode Hot100(中)
算法·leetcode
橘颂TA14 小时前
【剑斩OFFER】算法的暴力美学——最小覆盖字串
算法·c/c++·就业
wearegogog12314 小时前
基于混合蛙跳算法和漏桶算法的无线传感器网络拥塞控制与分簇新方法
网络·算法
Tiandaren15 小时前
大模型应用03 || 函数调用 Function Calling || 概念、思想、流程
人工智能·算法·microsoft·数据分析
2301_7951672015 小时前
玩转Rust高级应用 如何进行理解Refutability(可反驳性): 模式是否会匹配失效
开发语言·算法·rust
小当家.10516 小时前
[LeetCode]Hot100系列.贪心总结+思想总结
算法·leetcode·职场和发展
墨雪不会编程16 小时前
数据结构—排序算法篇二
数据结构·算法·排序算法
ShineWinsu17 小时前
对于数据结构:堆的超详细保姆级解析—上
数据结构·c++·算法·计算机·二叉树·顺序表·
im_AMBER17 小时前
Leetcode 46
c语言·c++·笔记·学习·算法·leetcode