深信服2024笔试

一 :服务器

小明是一名公司的IT运维工程师,负责管理公司的IT系统。公司总共有两个配置相同的服务器A和B,各运行了若干个服务。现在小明发现两台服务器上运行的服务占用的内存总和不相等(假设每个服务占用内存是-个恒定正整数),打算将两台服务器上的服务进行交换运行,但只能交换一次。
交换运行指:将服务器A上面的一个服务关闭,然后在服务器B上启动.同样服务器B关闭一个服务,然后在服务器A上启动。关闭的服务不能是刚刚启动的服务。
请写一个程序,帮助小明找出每个服务器上要交换的服务,交换后两台服务器上运行的服务占用的内存总和相等。
提示:我们可以首先遍历两个服务器上的所有服务,然后存储每个服务在两个服务器的内存差值。然后我们可以在哈希表中查找是否存在与某个服务相对应的内存差值,如果存在,那么这两个服务就是我们需要交换的服务。

输入描述:
有两行数据,每一行有多个正整数,中间以空格隔开,代表一台服务器A和B上运行的各个服务内存大小,每个服务的内存大小都小于1024

输出描述:

结果只输出两个数字,用空格隔开,代表每台服务器上要交换的那个服务的内存大小。第一个数字是服务器A上的,第二个是服务器B上的。如果找不到合适的服务或者不需要交换,输出fail。

用例1:

输入:

3 7 2

1 7

输出:

3 1

说明:将第一行服务器占用内存3的服务和第二行服务器占用内存1的服务交换,两行的数字总和相等

解答:

这道题目要求找出两台服务器上的服务,使得交换后两台服务器上服务的内存总和相等。下面是解题的详细步骤和代码解释:

  1. 输入处理
    • 从标准输入中读取两行数据,每行包含多个正整数,表示两台服务器A和B上各个服务占用的内存大小。
  2. 数据解析
    • 将每行数据按空格分割成字符串数组,然后将字符串数组转换为整型数组 serverAserverB
  3. 计算总内存
    • 分别计算服务器A和服务器B上所有服务内存的总和 sumAsumB
  4. 计算内存差值
    • 计算两台服务器总内存的差值 diff = sumA - sumB。由于我们希望交换后内存总和相等,因此 diff 必须是偶数才有可能找到合适的交换。
  5. 查找匹配服务
    • 使用哈希集合 memorySetA 存储服务器A上的所有服务内存值,以便快速查找。
    • 遍历服务器B上的服务,对于每个服务内存值 i,检查是否存在服务器A上的某个服务内存值等于 i + target,其中 target = diff / 2
  6. 输出结果
    • 如果找到符合条件的服务,则输出这两个服务的内存大小,即 i + targeti
    • 如果无法找到合适的服务,输出 “fail”。

下面是完整的Java代码实现:

java复制代码import java.util.*;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 读取服务器A和服务器B的服务内存大小String[] serverAInput = in.nextLine().split(" ");String[] serverBInput = in.nextLine().split(" ");// 将字符串数组转换为整型数组int[] serverA = new int[serverAInput.length];int[] serverB = new int[serverBInput.length];int sumA = 0, sumB = 0;for (int i = 0; i < serverAInput.length; i++) {serverA[i] = Integer.parseInt(serverAInput[i]);sumA += serverA[i];}for (int i = 0; i < serverBInput.length; i++) {serverB[i] = Integer.parseInt(serverBInput[i]);sumB += serverB[i];}// 计算两台服务器内存总和的差值int diff = sumA - sumB;// 如果差值不是偶数,则无法找到合适的交换方案if (diff % 2 != 0) {System.out.println("fail");return;}// 目标差值int target = diff / 2;// 使用哈希集合来存储服务器A的服务内存值Set<Integer> memorySetA = new HashSet<>();for (int mem : serverA) {memorySetA.add(mem);}// 在服务器B的服务中查找匹配的服务for (int mem : serverB) {if (memorySetA.contains(mem + target)) {// 找到了符合条件的服务,输出结果并返回System.out.println((mem + target) + " " + mem);return;}}// 如果没有找到合适的服务,输出failSystem.out.println("fail");}
}

这段代码通过遍历和哈希集合的方式实现了在两台服务器的服务内存中查找符合要求的交换方案,保证了算法的效率和正确性。

二:间谍解码算法

小明是一名间谍,他需要将情报数据(由多组数字组成,每一组有多个小于10的正整数)编码后传回总部。编码算法是这样的:针对一组数字,做逆序倒排,然后顺序打乱分成多行,每一行放一个数。再给每个数增加一个数字,说明下一个数字在第几行。请写出解码算法,将编码后的多行数据解码成原始的数字。

举例:
比如一组原始数据1 2 3 4 5,逆序成5 4 3 2 1。再拆成多行,加上下一个数的行数信息,如果是最后一个数,行数信息为0,得到:

4 2
3 4
1 0
2 3
5 1。

解码算法就是将上面的5行数据解码成1 2 3 4 5.

输入描述:

第一行为一个正整数T(T<=10),表示要解码的组数。接下来是每组要解码的数据。
对于每一组待解码数据:
第1行为一个正整数n(n<=1000000),表示有几个原始数字。接下来n行,每行有两个非负整数a和b,以空格隔开,表示一个数的信息。其中,a(a<=1000)表示数,b表示下一个数的行数(当前组的第一行实际内容为第一行),如果b为0,则表示没有下一个数。

输出描述:

对于每组测试数据输出一行,包含多个整数,相邻两个整数之间以一个空格隔开(最后一个整数之后不要有空格),整行表示解码后的一组数字。

测试用例:

输入:

3
5
6 3
9 4
7 0
3 5
2 1
6
2 2
6 3
7 4
2 5
8 6
2 0
4
8 0
5 1
6 2
4 3

输出:

7 6 2 3 9
2 8 2 7 6 2
8 5 6 4

说明:上面的测试用例表示有3组数据,然后第一组是:

5 #表示有5个数
6 3
9 4
7 0
3 5
2 1

后面每一行数据的第一个数字是按照原来顺序逆序排序,然后打乱的结果,6 3表示6的下一个数字在第3行,也就是7,表示原来的数据7应该在6的前面 以此类推 得出最开始的数据是7 6 2 3 9

解答

这道题目涉及到将经过特定编码算法处理后的数据进行解码。下面是详细的解题步骤和代码解释:

  1. 输入处理

    • 首先读取一个正整数 T,表示测试数据组数。
    • 对于每组数据,首先读取一个整数 n,表示有多少个原始数字需要解码。
    • 接下来的 n 行,每行包含两个非负整数 a 和 b,其中 a 表示一个数的值,b 表示下一个数在当前编码数据中的行数(从1开始,0表示没有下一个数)。
  2. 数据结构准备

    • 使用两个数组 numbersnextIndex,分别用来存储每个数的值和其下一个数的索引。如果没有下一个数,则 nextIndex 对应位置为 -1。
  3. 解码过程

    • 找到起始点:遍历 nextIndex 数组找到没有被指向的起始位置,即没有其他数指向它的位置,作为解码的起始点。

    • 从起始点开始,按照

      nextIndex
      

      数组的信息进行解码:

      • 将当前位置对应的数值添加到结果链表的开头。
      • 根据 nextIndex 的值更新当前位置,直到遇到 -1 表示结束。
  4. 输出结果

    • 对每组数据解码后的结果按照要求输出,每组数据输出一行。

下面是完整的Java代码实现:

java复制代码import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int T = sc.nextInt(); // 读取测试数据组数while (T-- > 0) {int n = sc.nextInt(); // 每组数据中的数字个数int[] numbers = new int[n];int[] nextIndex = new int[n];Arrays.fill(nextIndex, -1); // 初始化nextIndex数组为-1// 读取每个数的信息for (int i = 0; i < n; i++) {int num = sc.nextInt();int next = sc.nextInt();numbers[i] = num;if (next != 0) {nextIndex[i] = next - 1; // 注意行数是从1开始,数组索引从0开始,需要减1}}// 解码过程List<Integer> decoded = new ArrayList<>();boolean[] visited = new boolean[n]; // 记录每个数是否已经被访问过int current = findStartIndex(nextIndex); // 找到起始点while (current != -1) {decoded.add(numbers[current]);visited[current] = true;current = nextIndex[current]; // 更新当前位置}// 输出解码结果for (int num : decoded) {System.out.print(num + " ");}System.out.println();}sc.close();}// 找到起始点的方法private static int findStartIndex(int[] nextIndex) {for (int i = 0; i < nextIndex.length; i++) {if (nextIndex[i] == -1) {return i; // 返回第一个没有被指向的位置}}return -1; // 如果所有位置都被指向,返回-1}
}

这段代码通过遍历和数组操作实现了对编码后数据的解码,保证了解码过程的正确性和效率。

三:主机ip判断是否连通

在计算机中,主机与主机之间通过ip地址与网络来连接彼此,任意一台主机会通过ping命令去测试是否与另一台主机连通,而当给定了大批量的网络地址对后,网络管理员也需要快速地判断任意一对ip之间是否存在连通性。
例如: ip为203.0.113.0的主机和ip为198.51.100.0的机器存在连通性,而ip为198.51.100.0的机器又与10.0.0.0这台机器存在连通性,那么由于网络连通的传递性,203.0.113.0就马10.0.0.0存在连通可能性。而ip为172.16.0.0的主机与45.79.0.0的主机存在连通性,192.0.2.0的主机与104.236.0.0的主机存在连通性,其中一对ip中没有任意一个ip能与另一对ip的其中一个ip连通,因此172.16.0.0和192.0.2.0就不存在连通性。
现在给定n任意IP地址,判断它们之间是否能够连通,以及最短的连通跳数(跳数:连通所经过的主机数,如果A-B直连,则定义其为1,A-B经过C连接,则为2,以此类推,主机相同时其跳数为0)

输入描述:

第一行包含两个整数n和m,表示已知的IP地址数量和连通关系数量接下来n行,每行包含一个字符串和一个整数,表示一个IP地址和它的编号(编号范围[1,n]且不会重复)。
接下来m行,每行包含两个整数a和b,表示IP地址对应的编号a和b之间有连通关系。
接下来一行包含一个整数q,表示需要判断连通性的IP地址数量。
接下来q行,每行包含两个字符串,表示需要判断连通性的两个IP地址。

输出描述:对于每个需要判断连通性的IP地址对,如果它们连通,则输出跳数,否则输出-1。

测试用例:
输入:
7 7
192.168.0.1 1
192.168.0.2 2
192.168.0.3 3
192.168.0.4 4
192.168.0.5 5
192.168.0.6 6
192.168.0.7 7
1 2
2 3
1 3
3 6
6 7
2 7
4 5
5
192.168.0.1 192.168.0.1
192.168.0.1 192.168.0.2
192.168.0.1 192.168.0.6
192.168.0.1 192.168.0.7
192.168.0.3 192.168.0.4输出:
0
1
2
2
-1

解答

这道题目涉及到判断多个IP地址之间的连通性,并计算最短的连通跳数。以下是详细的解题步骤和代码解释:

  1. 输入处理
    • 首先读取两个整数 n 和 m,分别表示已知的IP地址数量和连通关系数量。
    • 接下来的 n 行,每行包含一个字符串和一个整数,表示一个IP地址和它的编号。
    • 接下来的 m 行,每行包含两个整数 a 和 b,表示具有连通关系的两个IP地址对应的编号。
    • 最后一行包含一个整数 q,表示需要判断连通性的IP地址对数量。
    • 接下来的 q 行,每行包含两个字符串,表示需要判断连通性的两个IP地址。
  2. 数据结构准备
    • 使用 ipToId 哈希表来映射每个IP地址到其对应的编号。
    • 使用 graph 列表来表示图的邻接表,其中 graph[i] 存储与编号为 i 的IP地址有直接连通关系的所有其他编号。
  3. 图的构建
    • 根据输入构建邻接表 graph,表示每个IP地址之间的直接连通关系。
  4. 解码过程
    • 对于每对需要判断连通性的IP地址,通过 ipToId 查找它们对应的编号。
    • 如果其中任意一个IP地址没有找到对应的编号,直接输出 -1 表示无法确定连通性。
    • 否则,使用 BFS(广度优先搜索)来计算从起始IP地址到目标IP地址的最短路径长度(即连通跳数)。
  5. 输出结果
    • 对每组需要判断连通性的IP地址对,输出计算得到的最短连通跳数或者 -1 表示不可达。

以下是完整的Java代码实现:

java复制代码import java.util.*;public class Main {private static Map<String, Integer> ipToId = new HashMap<>();private static List<List<Integer>> graph;public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // IP地址数量int m = sc.nextInt(); // 连通关系数量graph = new ArrayList<>();for (int i = 0; i <= n; i++) {graph.add(new ArrayList<>());}// 读取每个IP地址及其编号for (int i = 0; i < n; i++) {String ip = sc.next();int id = sc.nextInt();ipToId.put(ip, id);}// 构建图的邻接表for (int i = 0; i < m; i++) {int a = sc.nextInt();int b = sc.nextInt();graph.get(a).add(b);graph.get(b).add(a);}int q = sc.nextInt(); // 需要判断连通性的IP地址对数量for (int i = 0; i < q; i++) {String ip1 = sc.next();String ip2 = sc.next();// 获取IP地址对应的编号int ip1Id = ipToId.getOrDefault(ip1, -1);int ip2Id = ipToId.getOrDefault(ip2, -1);if (ip1Id == -1 || ip2Id == -1) {System.out.println(-1); // 如果任意一个IP地址找不到对应的编号,输出-1} else {// 使用 BFS 寻找最短路径长度(连通跳数)int shortestPath = bfs(ip1Id, ip2Id);System.out.println(shortestPath);}}sc.close();}private static int bfs(int start, int end) {if (start == end) return 0; // 如果起点和终点相同,跳数为0Queue<Integer> queue = new LinkedList<>();boolean[] visited = new boolean[graph.size()];int[] distance = new int[graph.size()];queue.offer(start);visited[start] = true;distance[start] = 0;while (!queue.isEmpty()) {int current = queue.poll();for (int neighbor : graph.get(current)) {if (!visited[neighbor]) {visited[neighbor] = true;distance[neighbor] = distance[current] + 1;if (neighbor == end) {return distance[neighbor];}queue.offer(neighbor);}}}return -1; // 如果没找到路径,返回-1表示不可达}
}

这段代码通过构建图的邻接表和使用 BFS 来实现了对多个IP地址之间连通性的判断,并计算了最短的连通跳数。

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

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

相关文章

【2024最新精简版】网络_Linux操作系统面试篇

文章目录 简述 tcp 和 udp的区别&#xff1f;get 和 post 请求有哪些区别&#xff1f;常用HTTP请求方式有哪些 ?进程跟线程的区别&#xff1f;僵尸进程&#xff1f;IO的多路复用&#xff1f;虚拟内存什么是OSI模型说一说HTTP协议说一说HTTPS协议HTTPS协议和HTTP协议有什么区别…

C语言 | Leetcode C语言题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; int trailingZeroes(int n) {int ans 0;while (n) {n / 5;ans n;}return ans; }

【MAUI】resource xml/file_paths (aka com.xxx.xxx:xml/ file _paths) not found.

APP2260:resource xml/file_paths (aka com.zettlercn.wms:xml/ file _paths) not found. This error is likely caused by an issue with the AndroidManifest.xml file or an Android manifest generation attribute in a source code file MAUI从6.0升级到8.0,调试发现资源…

【TensorFlow深度学习】TensorFlow与PyTorch框架间的异同对比

TensorFlow与PyTorch框架间的异同对比 TensorFlow与PyTorch框架间的异同对比:深度学习双雄的较量1. 设计哲学与学习曲线2. 模型构建与模块化3. 自动微分与优化器4. 分布式训练与部署5. 社区与生态系统TensorFlow与PyTorch框架间的异同对比:深度学习双雄的较量 在深度学习领域…

BGP高级特性

BGP路由反射器 l 路由反射器的两种角色 RR&#xff08;router reflector&#xff09;&#xff1a;路由反射器 client&#xff1a;RR客户端 l RR会将学习到的路由反射出去&#xff0c;从而使得IBGP路由在AS内传播时无需建立IBGP的全互联结构 l 将一台BGP路由器指定为RR的…

【仿真建模-anylogic】动态生成ConveyorCustomStation

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-18 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 背景 直接使用Anylogic组件开发的模型无法动态改变运输网布局&#xff1b;目前需求是要将运输网布局配置化&#xff1b;运输网配置化…

安卓逆向案例——X酷APP逆向分析

X酷APP逆向分析 这里介绍一下两种不同的挂载证书的方法。 chls.pro/ssl无法在浏览器中下载证书是什么原因解决方法&#xff1a; 法一 1. 挂载系统分区为读写 使用正确的挂载点来挂载系统分区为读写&#xff1a; su mount -o remount,rw /dev/uijISjR/.magisk/block/syste…

前端 CSS 经典:旋转边框效果

效果&#xff1a; 思路&#xff1a;使用伪元素&#xff0c;给伪元素设置背景色&#xff0c;然后定位&#xff0c;遮盖&#xff0c;旋转。就可以实现旋转边框效果。 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta chars…

docker in docker 在CI中应用解析

docker in docker 简介 docker里嵌套运行docker&#xff0c;本文讲解其在jenkins和gitlab-runner 种的调用流程 一、用于jenkins 容器化部署jenkins时调用docker命令集成CI功能 [rootops-demo~]# docker inspect jenkins --format"{{json .Mounts}}" [{"T…

电子竞赛1——基于DDS的AM信号发生器

课题要求 产生AM调幅波&#xff1b; 要求&#xff1a;载波10K&#xff0c;被调制波1K&#xff1b; 短按键1&#xff08;pin_143&#xff09;改变该调幅波的调制度&#xff1a;25%、50%、75%&#xff1b; 长按按键1&#xff08;pin_143&#xff09;改变被调制信号频率&#…

STM32通过SPI软件读写W25Q64

文章目录 1. W25Q64 2. 硬件电路 3. W25Q64框架图 4. 软件/硬件波形对比 5. 代码实现 5.1 MyI2C.c 5.2 MyI2C.h 5.3 W25Q64.c 5.4 W25Q64.h 5.5 W25Q64_Ins.h 5.6 main.c 1. W25Q64 对于SPI通信和W25Q64的详细解析可以看下面这篇文章 STM32单片机SPI通信详解-CSDN博…

工作实践:11种API性能优化方法

一、索引优化 接口性能优化时&#xff0c;大家第一个想到的通常是&#xff1a;优化索引。 确实&#xff0c;优化索引的成本是最小的。 你可以通过查看线上日志或监控报告&#xff0c;发现某个接口使用的某条SQL语句耗时较长。 此时&#xff0c;你可能会有以下疑问&#xff…

Web渗透:XSS-DOM-based XSS

DOM-based XSS&#xff08;基于DOM的跨站脚本攻击&#xff09;是一种XSS攻击类型&#xff0c;其特点是恶意脚本通过操作文档对象模型&#xff08;DOM&#xff09;直接在客户端执行&#xff0c;而无需经过服务器的处理。这种攻击主要利用客户端JavaScript代码中的漏洞&#xff0…

BP神经网络-入门到理解-长文讲述

本文来自&#xff1a;老饼讲解-BP神经网络 https://www.bbbdata.com 目录 一、BP神经网络的仿生意义 二、BP神经网络的结构 三、BP神经网络的前馈与后馈 3.1 BP神经网络的前馈 3.2 什么是BP神经网络的后馈 四、BP神经网络的训练 4.1 BP神经网络归一化 4.2 梯度下降算法…

完胜PSP的神器

小鸡模拟器&#xff0c;顾名思义&#xff0c;它是一个能够模拟多种经典游戏平台的软件&#xff0c;从家用游戏机到掌上游戏机&#xff0c;几乎覆盖了所有知名的老式游戏设备。这意味着&#xff0c;通过小鸡模拟器&#xff0c;我们可以在手机上重温那些陪伴我们度过童年时光的经…

springboot学习-图灵课堂-最详细学习

springboot-repeat springBoot学习代码说明为什么java -jar springJar包后项目就可以启动 配置文件介绍 springBoot学习 依赖引入 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>8</mav…

【教程】PVE下uhd630核显直通HDMI输出 以NUC9为例村雨Murasame

大家好&#xff0c;村雨本雨又来发教程了 最近在搞小主机&#xff0c;之前hp400g3仅仅200多元成功核显直通HDMI&#xff0c;作为简单NAS、解码机、伺服机、中控都非常棒&#xff0c;待机仅9w 村雨Murasame&#xff1a;【教程】7代核显直通HDMI成功输出画面 PVE下7代intel核显…

对象引用和对象赋值的区别

这两段代码的输出不同是因为对象引用和对象赋值的区别。 第一段代码&#xff1a; var controlPoints [{ x: 100, y: 200 }]; let obj null;controlPoints.forEach(item > {obj item; });obj.x 300; obj.y 500;controlPoints[0];第二段代码&#xff1a; var controlP…

数仓中数据分层的标准流向解读

在大数据开发中&#xff0c;数据分层是一个至关重要的概念。合理的数据分层可以有效地提升数据处理的效率和质量。本文将详细介绍数据分层的标准流向和相关注意事项&#xff0c;并结合实际应用进行说明。 数据分层的标准流向 根据行业标准&#xff0c;数据分层的标准流向如下…

IOS开发学习日记(十五)

目录 App启动过程及生命周期 App的启动 UIApplication UIApplicationDelegate 通过App生命周期回调实现启动页 闪屏的实现 简单实现闪屏功能 App启动过程及生命周期 App的启动 main函数前 动态链接 / 二进制文件加载 / runtime / 类的加载 ...... main函数 int main(int…