🌈 Scala 实现
题目描述:
- ***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资源池升序排序后的字符串即可。
备注:
输入VLAN资源池中VLAN的数量取值范围为[2-4094]间的整数,资源池中VLAN不重复且合法([1,4094]之间的整数),输入是乱序的。
示例
输入:
- 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。
代码:
def main(args: Array[String]): Unit = {
// 获取输入
val vlanList = StdIn.readLine().split(',').map(_.split('-').toList).toList
val vlan = StdIn.readLine().toInt
// 获取所有的Vlan
val buffer = new ListBuffer[Int]
for (elem <- vlanList) {
if (elem.length > 1) {
// 获取该区域内
getSecVlans(elem).foreach(buffer += _)
} else {
// 获取其中的元素(单个元素)
buffer += elem.head.toInt
}
}
// 去除所需的Vlan
buffer.remove(buffer.indexOf(vlan))
// 处理输出,并记录结果
val res = new StringBuffer()
val sorted = buffer.sorted
println(s"sorted: ${sorted}")
var start = sorted.head
var last = start
for (i <- 1 until sorted.length) {
val curr = sorted(i)
if (curr == last + 1) {
last = curr
} else {
vlanFormat(res, start, last)
last = curr
start = last
}
}
vlanFormat(res, start, last);
// 输出结果
println(res.substring(0, res.length() - 1))
}
// 获取子Vlan
def getSecVlans(list: List[String]): ListBuffer[Int] = {
val start = list.head.toInt
val end = list(1).toInt
val tmp = new ListBuffer[Int]
for (i <- start to end) {
tmp.append(i)
}
tmp
}
// 格式化输出
def vlanFormat(sb: StringBuffer, start: Int, last: Int): Unit = {
if (start.equals(last)) sb.append(last).append(",")
else sb.append(start).append("-").append(last).append(",")
}
❤️ END ❤️