注意!答案仅作为参考(实际考试中下列代码通过用例100%,但不代表最优解)
Vlan是一种为局域网设备进行逻辑划分的技术
为了标识不同的vlan 引入了vlan id 1~4094之间的整数
定义一个vlan id 的资源池
资源池中连续的vlan用开始vlan-结束vlan表示,
不连续的用单个整数表示
所有的vlan用英文逗号连接起来
现有一个vlan资源池,业务需要从资源池中申请一个vlan
需要你输出从vlan资源池中移除申请的vlan后的资源池
输入描述
第一行为字符串格式的vlan资源池
第二行为业务要申请的vlan vlan的取值范围1~4094
输出描述
从输入vlan资源池中移除申请的vlan后
字符串格式的vlan资源池
输出要求满足题目中要求的格式,
并且要求从小到大升序输出
如果申请的vlan不在原资源池,输出升序排序的原资源池的字符串即可
示例一
输入
1-5
2
输出
1,3-5
说明:原vlan资源池中有1 2 3 4 5 移除2后
剩下的1 3 4 5按照升序排列的方式为 1 3-5
示例二
输入
20-21,15,18,30,5-10
15
输出
5-10,18,20-21,30
说明:
原vlan资源池中有5 6 7 8 9 10 15 18 20 21 30
移除15后 剩下的为 5 6 7 8 9 10 18 20 21 30
按照题目描述格式并升序后的结果为5-10,18,20-21,30
示例三
输入
5,1-3
10
输出
1-3,5
import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String input = in.nextLine();
Integer request = Integer.parseInt(in.nextLine());
in.close();
TreeSet<Integer> set = new TreeSet<>();
for (String str : input.split(",")) {
if (str.contains("-")) {
String[] split = str.split("-");
int start = Integer.parseInt(split[0]);
int end = Integer.parseInt(split[1]);
for (int i = start; i <= end; i++) {
set.add(i);
}
} else {
set.add(Integer.parseInt(str));
}
}
set.remove(request);
ArrayList<Integer> list = new ArrayList<>(set);
StringBuilder sb = new StringBuilder();
Integer start = list.get(0);
Integer last = start;
for (int i = 1; i < list.size(); i++) {
Integer cur = list.get(i);
if (cur == last + 1) {
last = cur;
} else {
append(sb, start, last);
start = last = cur;
}
&
京公网安备 11010502036488号