HUAWEI 机试题:VLAN资源池

🌈 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 ❤️
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOEL-T99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值