前言
工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近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));
}
}
}