华为OD机试 - VLAN资源池 - 回溯、双指针(Java 2023 B卷 100分)

news/2024/7/20 17:39:54 标签: 华为od, java, 开发语言

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
      • 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-521,3-5原VLAN资源池中有VLAN 1、2、3、4、5,从资源池中移除2后,剩下VLAN 1、3、4、5,按照题目描述格式并升序后的结果为1,3-5。
20-21,15,18,30,5-10155-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-3101-3,5原VLAN资源池中有VLAN 1、2、3,5,申请的VLAN 10不在原资源池中,将原资源池按照题目描述格式并按升序排序后输出的结果为1-3,5。

四、解题思路

1、核心思想

  1. 根据题意,第一行输入VLAN资源池:19-20,12,17,23,3-7
  2. 第二行输入业务要申请的VLAN:12
  3. 输出要求满足题目描述中的格式:3-7, 17, 19-20, 23]

2、具体解题思路

  1. 第一行输入VLAN资源池;
  2. 第二行输入业务要申请的VLAN;
  3. 按照指定格式,拆分VLAN资源池vlanStr,将数据加载到vlanList;
  4. 升序排序;
  5. 如果VLAN资源池包含业务要申请的VLAN,先移除业务要申请的VLAN;
  6. 递归拼接满足题目描述中的格式;
    • 如果VLAN资源池为空,直接拼接第一个VLAN;
    • 判断下一个VLAN是否是递增的VLAN,如果是,需要转换成-格式;
    • 需要转换成-格式;
  7. 输出满足题目描述中的格式的VLAN资源池;

五、Java算法源码

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在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/4982598.html

相关文章

arm版Linux下安装es集群

背景&#xff1a;由于生产上网络没通&#xff0c;没办法&#xff0c;只能自己安装一个es集群的测试环境了&#xff0c;我的电脑是Mac M2&#xff0c;安装的Linux是centos7&#xff0c;也是arm版的。 第一步&#xff1a;查看自己Linux系统的版本 命令&#xff1a;uname -a 例如…

微软用 18 万行 Rust 重写了 Windows 内核

微软正在使用 Rust 编程语言重写其核心 Windows 库。 5 月 11 日——Azure 首席技术官 Mark Russinovich 表示&#xff0c;最新的 Windows 11 Insider Preview 版本是第一个包含内存安全编程语言 Rust 的版本。 “如果你参加了 Win11 Insider 环&#xff0c;你将在 Windows 内…

c#多线程—基础概念到“双色球”项目实现(附知识点目录、代码、视频)

总结&#xff1a;视频中对于多线程讲的非常透彻&#xff0c;从线程基础概念—>.net不同版本出现的线程方法—>多线程常出现问题—>双色球项目实践&#xff0c;每个知识点都有代码实操&#xff0c;受益匪浅。附上学习笔记和实操代码。 视频 目录 一、线程、进程概念及优…

National Instruments NI-XNET

该接口增加了对National Instruments的NI-XNET CAN控制器的支持。 Note NI-XNET仅支持windows平台。 Bus class can.interfaces.nixnet.NiXNETcanBus class can.interfaces.nixnet.NiXNETcanBus( channel=CAN1, bitrate=500000, timing=None, can_filters

Unity记录4.2-存储-从json文件获取Tile路径

文章首发见博客&#xff1a;https://mwhls.top/4813.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 汇总&#xff1a;Unity 记录 摘要&#xff1a;从json文件获取Tile材质路径。 确定保存方案-2023/08/1…

oracle中的(+)

一、()为何意&#xff1f; oracle中的&#xff08;&#xff09;是一种特殊的用法&#xff0c;&#xff08;&#xff09;表示外连接&#xff0c;并且总是放在非主表的一方。 二、举例 左外连接&#xff1a; select A.a,B.a from A LEFT JOIN B ON A.bB.b; 等价于 select A.a,B.…

提升代码逻辑的感觉——python循环语句

提升代码逻辑的感觉——python循环语句 简介 循环是编程中的一个非常重要的概念&#xff0c;它用于处理重复性任何和迭代草错&#xff0c;通过循环我们能优化并简化代码&#xff0c;提高代码的可维护性&#xff0c;在Python中循环是一种控制结构&#xff0c;允许我们重复执行…

电脑桌面备忘录怎么设置?如何在电脑上同步使用手机备忘录?

在工作中&#xff0c;上班族们需要经常记下一些重要的事项&#xff0c;如开会时间、工作进度、待办事项等等。这些信息对于他们来说至关重要&#xff0c;因为一旦遗忘或错过了这些事项&#xff0c;就可能造成不必要的麻烦和负面影响。因此&#xff0c;一款便捷的备忘录软件成为…