华为开发岗暑期实习笔试(2025年4月16日)

刷题小记:

第一题怀疑测试样例不完整,贪心法不应该能够解决该题。第二题使用0-1BFS解决单源最短路径的问题,往往搭配双端队列实现。第三题是运用动态规划解决最大不重叠子区间个数的问题,难点在于满足3重判断规则,所需数据结构及相关操作较多。

1.最小测试用例集覆盖

题目分析:

题目描述:

二维cases表示测试用例的覆盖情况,cases[i][j]为 1 表示第i个测试用例覆盖了第j个模块,为 0 则表示未覆盖。

求一个最小的测试用例集合,使得该集合能够覆盖所有模块。

返回该最小的集合大小,如果不存在这样的集合,返回-1。

输入描述:

第一行给定两个整数,分别表示用例总数n和代码模块总数m

第二行开始的n行,每行有m个整数(0或1),表示覆盖情况。

n,m均属于[1,50]区间

输出描述:

输出一个整数表示最小用例集合的大小,若不存在则输出-1

解题思路:

当且仅当 存在j,对任意的i,均有cases[i][j] == 0时,不存在最小覆盖集合,此时返回-1。

第i行表示第i个测试用例对m个模块的覆盖情况,

用一个长度为m的数组mo记录样例集合对模块的覆盖情况,其值为每一列由各样例的对应列取并得到。

如果采用回溯法(暴力搜索),那么遍历全部覆盖集的时间复杂度为O(2^n),而检查数组mo的时间复杂度为O(n),那么总的时间复杂度为O(n * 2^n),太大!

如果采用贪心法,每次选择覆盖模块最多的测试样例添入集合,仍然无法保证测试样例集合最小。(据说真实考试情况下,该贪心法过了?!)

2.小慕的地铁大挑战

题目分析:

题目描述:

有N条地铁线路,每条线路按顺序连接若干站点,且一条线路上不存在重复的站点名。

地铁乘坐规则如下:进入任意一条地铁线路需支付2元,每换乘一次加收1元。

现求小慕从某个出发站前往指定的目的站,规划一条最省钱的路线并返回最低票价;若不能抵达,输出"NA"。

输入描述:

第一行一个整数N表示地铁线路数量,介于[1,1000]。

接下来N行,每行描述一条地铁线路,用空格分隔若干个站点名(站点名长度不超过100个字符),最多包含100个站点。不同线路间站点名可能重复,表示是换乘站。

第N+1行包含两个站点名,分别是出发站和目的站。

输入保证:若存在可达路径,则方案唯一。

输出描述:

第一行输出“换乘路径”(除起始点外,只包含可能存在的换乘站点),站点之间用"-"连接。

第二行输出该方案的总票价。

若无可达路径,只输出一行"NA"

解题思路:

运用0-1广度优先搜索遍历所有路径,找出权值最小的路径,其中:在线路内部移动的边权为0,换乘时的边权为1。

关键步骤:
  1. 构建状态图:key是(站点名,所属线路编号),value是(下一站点,权重)的列表,其中用"虚拟线路编号-1"表示换乘口
    1. 对于同一条地铁线路的相邻站点(A,i)和(B,i)相连,即给(A,i)的value列表添加((B,i),0),给(B,i)的value列表添加((A,i),0)
    2. 对于每个站点,将其与对应的虚拟换乘口相连
      1. 从站点(A,i)到虚拟换乘口(A,-1)的权为1,即给(A,i)的value列表添加((A,-1),1)
      2. 从虚拟换乘口(A,-1)到站点(A,i)的权为0,即给(A,-1)的value列表添加((A,i),0)
  1. 路径搜索算法 0-1BFS:
    1. 使用双端队列Deque,优先处理权值为0的边,即将其加入队头(优先出队);处理权值为1的边时,将其加入队尾(后出队),已访问过的节点直接跳过
    2. 用一个映射d记录每个节点的最小费用,初始化为INT_MAX
    3. 用一个映射pre记录每个节点的前置节点,以便第一次找到终点后复现路径(权值为0的节点被优先处理,广度优先搜索能确保找到目标点时路径代价最小)
  1. 路径还原与票价计算:
    1. 找到终点时,借助pre映射还原路径,每遇到(node, -1)的节点表示为换乘节点,将其添加入路径并记录换乘代价
    2. 票价 = 2 + 换乘代价 - 1,因为(起点, -1)被视作了换乘节点加入路径,而其本身是不需要换乘的,只是为了统一写法才记为-1,因此票价公式末尾减去1
  1. 如果最终最短路径映射d不包含终点,表示不存在能够从起点到达该终点的路径,输出NA。

3.满足尽可能多的业务需求的IP区间方案组

题目分析:

题目描述:

业务的网络地址需求用一个闭区间[startip, endip]表示。

由于要求不同业务的IP地址区间不能重叠,要求按照一定的顺序将这些业务需求排序,尽可能满足更多的业务需求:

  • 当业务数量相同时,以IP地址占用区间最少的优先
  • 当业务数量相同时且IP地址占用区间大小也相同时,按照IP范围排序,比较起始地址,起始地址最小者优先。
输入描述:

第一行为业务个数N,有效范围是[1, 1000]

接下来N行是IP地址区间,每行有startip和endip,均为合法的IPv4地址格式,即(A, B, C, D),其中ABCD的取值范围是[0, 255]

注意:IP地址大小的比较,是按照A、B、C和D的顺序进行比较。

输出描述:

输出排序好的M个IP区间,每行一个。

解题思路:

首先将IP地址转换成32位的整数进行存储,便于比较大小。

然后将这些IP区间按照startip进行升序排序,若startip相同,那么按照endip进行升序排序,得到32位转换以及排序后的N行2列的整型数组ips。

动规五部曲:
  1. 确定dp数组以及下标的含义:dp[i]表示以第i个区间结尾的最大不重叠子区间数量
  2. 确定递推公式:对于以j(j < i)为结尾的最大不重叠子区间方案,如果与第i个区间不重叠,那么:
    1. 如果dp[j] + 1> dp[i],那么以第i个区间为结尾的方案为在以第j个区间为结尾的最大不重叠区间数方案的基础上加上第i个区间;
    2. 如果dp[j] + 1 == dp[i],那么比较以第i个区间为结尾的最优方案,以及以第j个区间为结尾的最优方案的基础上添加第i个区间,比较这两个方案的长度,选择较短者;如果两个方案的长度相同,比较两个方案的起始IP地址。
  1. 确定遍历方向:由于dp[i]依赖于dp[j](j < i),因此正序遍历即可。
  2. dp数组初始化:遍历第i个区间时,由于一定以第i个区间结尾,因此初始化dp[i] = 1表示将第i个区间添入业务组合方案。
import java.util.*;public class Ipv4ToIntConverter {public static int ipv4ToInt(String ipAddress) {String[] parts = ipAddress.split("\\.");int result = 0;for (int i = 0; i < 4; i++) {int octet = Integer.parseInt(parts[i]);result = (result << 8) | octet;}return result;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine(); // 消耗掉换行符int[][] ips = new int[n][2];for (int i = 0; i < n; i++) {String[] line = scanner.nextLine().split(" ");ips[i][0] = ipv4ToInt(line[0]);ips[i][1] = ipv4ToInt(line[1]);}// 按照 startip 升序排序,如果 startip 相同,按照 endip 升序排序Arrays.sort(ips, (a, b) -> {if (a[0] == b[0]) {return Integer.compare(a[1], b[1]);}return Integer.compare(a[0], b[0]);});// dp[i] 表示以第 i 个区间结尾的最大不重叠区间数量int[] dp = new int[n];// 记录每个状态下选择的区间List<List<int[]>> choices = new ArrayList<>();// 记录每个状态下选择的区间的总长度int[] lengths = new int[n];for (int i = 0; i < n; i++) {dp[i] = 1;choices.add(new ArrayList<>());choices.get(i).add(ips[i]);lengths[i] = ips[i][1] - ips[i][0];for (int j = 0; j < i; j++) {if (ips[j][1] < ips[i][0]) {// 第i个区间与第j个区间不重合if (dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;List<int[]> newChoice = new ArrayList<>(choices.get(j));newChoice.add(ips[i]);choices.set(i, newChoice);lengths[i] = lengths[j] + (ips[i][1] - ips[i][0]);} else if (dp[j] + 1 == dp[i]) {int newLength = lengths[j] + (ips[i][1] - ips[i][0]);if (newLength < lengths[i]) {List<int[]> newChoice = new ArrayList<>(choices.get(j));newChoice.add(ips[i]);choices.set(i, newChoice);lengths[i] = newLength;} else if (newLength == lengths[i]) {if (newChoice.get(0)[0] < choices.get(i).get(0)[0]) {List<int[]> newChoice = new ArrayList<>(choices.get(j));newChoice.add(ips[i]);choices.set(i, newChoice);}}}}}}// 找到最大不重叠区间数量的方案int maxCount = 0;List<int[]> bestChoice = new ArrayList<>();int minLength = Integer.MAX_VALUE;int startIp = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {if (dp[i] > maxCount) {maxCount = dp[i];bestChoice = choices.get(i);minLength = lengths[i];startIp = bestChoice.get(0)[0];} else if (dp[i] == maxCount) {if (lengths[i] < minLength) {bestChoice = choices.get(i);minLength = lengths[i];startIp = bestChoice.get(0)[0];} else if (lengths[i] == minLength) {if (choices.get(i).get(0)[0] < startIp) {bestChoice = choices.get(i);startIp = bestChoice.get(0)[0];}}}}// 输出结果for (int[] ip : bestChoice) {System.out.println(intToIpv4(ip[0]) + " " + intToIpv4(ip[1]));}scanner.close();}public static String intToIpv4(int ip) {StringBuilder sb = new StringBuilder();for (int i = 3; i >= 0; i--) {sb.append((ip >> (i * 8)) & 255);if (i > 0) {sb.append(".");}}return sb.toString();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust: 从内存地址信息看内存布局

内存布局其实有几个&#xff1a;address&#xff08;地址&#xff09;、size&#xff08;大小&#xff09;、alignment&#xff08;对齐位数&#xff0c;2 的自然数次幂&#xff0c;2&#xff0c;4&#xff0c;8…&#xff09;。 今天主要从address来看内存的布局。 说明&…

每日一题算法——两个数组的交集

两个数组的交集 力扣题目链接 我的解法&#xff1a;利用数组下标。 缺点&#xff1a;当取值范围很大时&#xff0c;浪费空间。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int count1[1001]{0…

c++ 互斥锁

为练习c 线程同步&#xff0c;做了LeeCode 1114题. 按序打印&#xff1a; 给你一个类&#xff1a; public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…

山东大学软件学院创新项目实训开发日志(20)之中医知识问答自动生成对话标题bug修改

在原代码中存在一个bug&#xff1a;当前对话的标题不是现有对话的用户的第一段的前几个字&#xff0c;而是历史对话的第一段的前几个字。 这是生成标题的逻辑出了错误&#xff1a; 当改成size()-1即可

WSL2-Ubuntu22.04下拉取Docker MongoDB镜像并启动

若未安装docker可参考此教程&#xff1a;可以直接在wsl上安装docker吗&#xff0c;而不是安装docker desktop&#xff1f;-CSDN博客 1. 拉取镜像 docker pull mongo:latest 2.打开网络加速&#xff0c;再次拉取镜像 3.创建docker-compose.yml 进入vim编辑器后输入i进行编辑&a…

中通 Redis 集群从 VM 迁移至 PVE:技术差异、PVE 优劣势及应用场景深度解析

在数字化转型浪潮下&#xff0c;企业对服务器资源的高效利用与成本控制愈发重视。近期&#xff0c;中通快递将服务器上的 Redis 集群服务从 VM&#xff08;VMware 虚拟化技术&#xff09;迁移至 PVE&#xff08;Proxmox VE&#xff09;&#xff0c;这一技术举措引发了行业广泛关…

Prometheus+Grafana实时监控系统各项指标

一、监控架构设计 核心组件与数据流 Prometheus&#xff1a;时序数据采集、存储与告警规则管理Node Exporter&#xff1a;采集主机指标&#xff08;CPU、内存、磁盘、网络等&#xff09;数据库Exporter&#xff1a;如 mysqld_exporter、postgres_exporterGrafana&#xff1a;…

[密码学基础]GMT 0029-2014签名验签服务器技术规范深度解析

GMT 0029-2014签名验签服务器技术规范深度解析 引言 在数字化转型和网络安全需求激增的背景下&#xff0c;密码技术成为保障数据完整性与身份认证的核心手段。中国密码管理局发布的GMT 0029-2014《签名验签服务器技术规范》&#xff0c;为签名验签服务器的设计、开发与部署提…

多路转接select服务器

目录 select函数原型 select服务器 select的缺点 前面介绍过多路转接就是能同时等待多个文件描述符&#xff0c;这篇文章介绍一下多路转接方案中的select的使用 select函数原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…

QT6 源(45):分隔条 QSplitter 允许程序的用户修改布局,程序员使用 IDE时,就是分隔条的用户,以及其 QSplitter 源代码

&#xff08;1&#xff09; &#xff08;2&#xff09;本类的继承关系如下&#xff0c;所以说分隔条属于容器&#xff1a; &#xff08;3&#xff09;本类的属性&#xff1a; &#xff08;4&#xff09; 这是一份 QSplitter 的举例代码&#xff0c;注意其构造函数时候的传参&am…

VSCode PIO使用Jlink SWD烧录Stm32

一、背景 PIO的编译速度比Arduino快很多&#xff0c;同样支持Arduino的语法。VScode的自动补全和插件也能够帮助快速开发目前使用JLINK SWD的方式连接STM32 二、配置 在ini配置文件中&#xff0c;添加如下内容 [env:genericSTM32F103C8] platform ststm32 board genericS…

JavaScript 渲染内容爬取:Puppeteer 入门

在现代网络应用中&#xff0c;许多网页内容是通过 JavaScript 渲染生成的&#xff0c;传统的爬虫工具往往难以获取这些动态内容。Puppeteer 作为一种强大的浏览器自动化工具&#xff0c;为这一问题提供了优雅的解决方案。本文将带你入门 Puppeteer&#xff0c;介绍如何安装、启…

卷积神经网络:视觉炼金术士的数学魔法

引言&#xff1a;当数学遇见视觉炼金术 在人工智能的奇幻世界里&#xff0c;卷积神经网络&#xff08;CNN&#xff09;犹如掌握视觉奥秘的炼金术士&#xff0c;将原始像素的"铅块"淬炼成认知的"黄金"。这种融合数学严谨性与生物灵感的算法架构&#xff0c…

Android Cordova 开发 - Cordova 快速入门(Cordova 环境配置、Cordova 第一个应用程序)

一、Cordova 1、Cordova 概述 Cordova 是使用 HTML&#xff0c;CSS 和 JavaScript 构建混合移动应用程序的平台 2、Cordova 特征 &#xff08;1&#xff09;命令行界面&#xff08;Cordova CLI&#xff09; 这是可用于启动项目&#xff0c;构建不同平台的进程&#xff0c;…

ubuntu18.04启动不了修复

参考: 虚拟机里的Ubuntu18.4启动时进入到grub rescue救援模式&#xff08;无法正常进入到系统&#xff09;&#xff0c;ls查看后只有一个硬盘和分区&#xff0c;且无法找到/boot/grub文件【已解决】_ubuntu grub rescue-CSDN博客 本人fdisk错误使用,导致了grub启动不了 第一步…

SpringBoot3设置maven package直接打包成二进制可执行文件

注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package&#xff08;注意&#xff1a;使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…

【华为】防火墙双击热备-之-主备模式-单外网线路

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…

MYSQL之表的操作

1. 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名, datatype 表示列的类型character set 字符集, 如果没有指定字符集, 则以所在数据库的字符集为…

RAG进阶:Chroma开源的AI原生向量数据库

一、Chroma 核心概念与优势 1. 什么是 Chroma&#xff1f; Chroma 是一款开源的向量数据库&#xff0c;专为高效存储和检索高维向量数据设计。其核心能力在于语义相似性搜索&#xff0c;支持文本、图像等嵌入向量的快速匹配&#xff0c;广泛应用于大模型上下文增强&#xff0…

店匠科技摘得 36 氪“2025 AI Partner 创新大奖”

全场景 AI 方案驱动跨境电商数智化跃迁 4 月 18 日,36 氪 2025 AI Partner 大会于上海盛大开幕。大会紧扣“Super App 来了”主题,全力探寻 AI 时代的全新变量,探索 AI 领域下一个超级应用的无限可能性。在此次大会上,跨境电商独立站 SaaS 平台店匠科技(Shoplazza)凭借“店匠跨…