目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 1、核心思想
- 2、具体解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。
定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单个整数表示,所有的VLAN用英文逗号连接起来。
现在有一个VLAN资源池,业务需要从资源池中申请一个VLAN,需要你输出从VLAN资源池中移除申请的VLAN后的资源池。
二、输入描述
第一行为字符串格式的VLAN资源池;
第二行为业务要申请的VLAN。
VLAN的取值范围为[1,4094]之间的整数。
三、输出描述
从输入VLAN资源池中移除申请的VLAN后字符串格式的VLAN资源池,输出要求满足题目描述中的格式,并且按照VLAN从小到大升序输出。
如果申请的VLAN不在原VLAN资源池内,输出原VLAN资源池升序排序后的字符串即可。
输入1 | 输入2 | 输出 | 说明 |
---|---|---|---|
1-5 | 2 | 1,3-5 | 原VLAN资源池中有VLAN 1、2、3、4、5,从资源池中移除2后,剩下VLAN 1、3、4、5,按照题目描述格式并升序后的结果为1,3-5。 |
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。 |
5,1-3 | 10 | 1-3,5 | 原VLAN资源池中有VLAN 1、2、3,5,申请的VLAN 10不在原资源池中,将原资源池按照题目描述格式并按升序排序后输出的结果为1-3,5。 |
四、解题思路
1、核心思想
- 根据题意,第一行输入VLAN资源池:19-20,12,17,23,3-7
- 第二行输入业务要申请的VLAN:12
- 输出要求满足题目描述中的格式:3-7, 17, 19-20, 23]
2、具体解题思路
- 第一行输入VLAN资源池;
- 第二行输入业务要申请的VLAN;
- 按照指定格式,拆分VLAN资源池vlanStr,将数据加载到vlanList;
- 升序排序;
- 如果VLAN资源池包含业务要申请的VLAN,先移除业务要申请的VLAN;
- 递归拼接满足题目描述中的格式;
- 如果VLAN资源池为空,直接拼接第一个VLAN;
- 判断下一个VLAN是否是递增的VLAN,如果是,需要转换成-格式;
- 需要转换成-格式;
- 输出满足题目描述中的格式的VLAN资源池;
五、Java算法源码
package com.guor.od;
import java.util.*;
public class OdTest02 {
/**
* VLAN资源池:19-20,12,17,23,3-7
* 业务要申请的VLAN:12
* 输出要求满足题目描述中的格式:3-7, 17, 19-20, 23]
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
/**
* VLAN资源池
* 包含数字、字符逗号,横线-
*/
String vlanStr = scanner.nextLine();
// 业务要申请的VLAN
Integer remove = Integer.parseInt(scanner.nextLine());
List<Integer> vlanList = new ArrayList<>();
// 按照指定格式,拆分VLAN资源池vlanStr,将数据加载到vlanList
String[] arr = vlanStr.split(",");
for (String vlan : arr) {
if (vlan.contains("-")) {
String[] split = vlan.split("-");
int start = Integer.parseInt(split[0]);
int end = Integer.parseInt(split[1]);
for (int i = start; i <= end; i++) {
vlanList.add(i);
}
} else {
vlanList.add(Integer.parseInt(vlan));
}
}
// 升序排序
vlanList.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (o1 > o2) {
return 1;
} else if (o1 < o2) {
return -1;
} else {
return 0;
}
}
});
// 如果VLAN资源池不包含业务要申请的VLAN,直接返回VLAN资源池
if (vlanList.contains(remove)) {
// 从VLAN资源池中删除业务要申请的VLAN
vlanList.remove(remove);
// 移除要申请的VLAN后的VLAN资源池
System.out.println(vlanList);
}
// 递归拼接满足题目描述中的格式
get(vlanList, vlanList.get(0));
System.out.println(retList);
}
// 满足题目描述中的格式的VLAN资源池
static List<String> retList = new ArrayList<>();
/**
* 递归拼接满足题目描述中的格式
*
* @vlanList 3, 4, 5, 6, 7, 17, 19, 20, 23
* @return 3-7, 17, 19-20, 23
*/
private static void get(List<Integer> vlanList, int left) {
if (vlanList.size() == 0) {
return;
}
int step = left;
int right = left;
// 第一个VLAN
vlanList.remove(0);
// 如果VLAN资源池为空,直接拼接第一个VLAN
if (vlanList.size() == 0) {
retList.add(String.valueOf(left));
return;
}
// 判断下一个VLAN是否是递增的VLAN,如果是,需要转换成-格式
while (vlanList.get(0) == ++step) {
right = step;
vlanList.remove(0);
}
// 需要转换成-格式
if (left != right) {
retList.add(left + "-" + right);
} else {
retList.add(String.valueOf(left));
}
// 递归拼接满足题目描述中的格式
get(vlanList, vlanList.get(0));
}
}
六、效果展示
1、输入
19-20,12,17,23,3-7
12
2、输出
3-7, 17, 19-20, 23
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。