做国外搞笑网站有哪些,网站开发访客ip,网站建设研究,网站做专题一 #xff1a;服务器
小明是一名公司的IT运维工程师#xff0c;负责管理公司的IT系统。公司总共有两个配置相同的服务器A和B#xff0c;各运行了若干个服务。现在小明发现两台服务器上运行的服务占用的内存总和不相等(假设每个服务占用内存是-个恒定正整数)#xff0c;打…一 服务器
小明是一名公司的IT运维工程师负责管理公司的IT系统。公司总共有两个配置相同的服务器A和B各运行了若干个服务。现在小明发现两台服务器上运行的服务占用的内存总和不相等(假设每个服务占用内存是-个恒定正整数)打算将两台服务器上的服务进行交换运行但只能交换一次。 交换运行指:将服务器A上面的一个服务关闭然后在服务器B上启动.同样服务器B关闭一个服务然后在服务器A上启动。关闭的服务不能是刚刚启动的服务。 请写一个程序帮助小明找出每个服务器上要交换的服务交换后两台服务器上运行的服务占用的内存总和相等。 提示:我们可以首先遍历两个服务器上的所有服务然后存储每个服务在两个服务器的内存差值。然后我们可以在哈希表中查找是否存在与某个服务相对应的内存差值如果存在那么这两个服务就是我们需要交换的服务。
输入描述 有两行数据每一行有多个正整数中间以空格隔开代表一台服务器A和B上运行的各个服务内存大小每个服务的内存大小都小于1024
输出描述
结果只输出两个数字用空格隔开代表每台服务器上要交换的那个服务的内存大小。第一个数字是服务器A上的第二个是服务器B上的。如果找不到合适的服务或者不需要交换输出fail。
用例1
输入
3 7 2
1 7
输出
3 1
说明将第一行服务器占用内存3的服务和第二行服务器占用内存1的服务交换两行的数字总和相等
解答
这道题目要求找出两台服务器上的服务使得交换后两台服务器上服务的内存总和相等。下面是解题的详细步骤和代码解释
输入处理 从标准输入中读取两行数据每行包含多个正整数表示两台服务器A和B上各个服务占用的内存大小。 数据解析 将每行数据按空格分割成字符串数组然后将字符串数组转换为整型数组 serverA 和 serverB。 计算总内存 分别计算服务器A和服务器B上所有服务内存的总和 sumA 和 sumB。 计算内存差值 计算两台服务器总内存的差值 diff sumA - sumB。由于我们希望交换后内存总和相等因此 diff 必须是偶数才有可能找到合适的交换。 查找匹配服务 使用哈希集合 memorySetA 存储服务器A上的所有服务内存值以便快速查找。遍历服务器B上的服务对于每个服务内存值 i检查是否存在服务器A上的某个服务内存值等于 i target其中 target diff / 2。 输出结果 如果找到符合条件的服务则输出这两个服务的内存大小即 i target 和 i。如果无法找到合适的服务输出 “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的服务内存值SetInteger 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(T10)表示要解码的组数。接下来是每组要解码的数据。 对于每一组待解码数据: 第1行为一个正整数n(n1000000)表示有几个原始数字。接下来n行每行有两个非负整数a和b以空格隔开表示一个数的信息。其中a(a1000)表示数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
解答
这道题目涉及到将经过特定编码算法处理后的数据进行解码。下面是详细的解题步骤和代码解释 输入处理 首先读取一个正整数 T表示测试数据组数。对于每组数据首先读取一个整数 n表示有多少个原始数字需要解码。接下来的 n 行每行包含两个非负整数 a 和 b其中 a 表示一个数的值b 表示下一个数在当前编码数据中的行数从1开始0表示没有下一个数。 数据结构准备 使用两个数组 numbers 和 nextIndex分别用来存储每个数的值和其下一个数的索引。如果没有下一个数则 nextIndex 对应位置为 -1。 解码过程 找到起始点遍历 nextIndex 数组找到没有被指向的起始位置即没有其他数指向它的位置作为解码的起始点。 从起始点开始按照 nextIndex数组的信息进行解码 将当前位置对应的数值添加到结果链表的开头。根据 nextIndex 的值更新当前位置直到遇到 -1 表示结束。 输出结果 对每组数据解码后的结果按照要求输出每组数据输出一行。
下面是完整的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}}// 解码过程ListInteger 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直连则定义其为1A-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地址之间的连通性并计算最短的连通跳数。以下是详细的解题步骤和代码解释
输入处理 首先读取两个整数 n 和 m分别表示已知的IP地址数量和连通关系数量。接下来的 n 行每行包含一个字符串和一个整数表示一个IP地址和它的编号。接下来的 m 行每行包含两个整数 a 和 b表示具有连通关系的两个IP地址对应的编号。最后一行包含一个整数 q表示需要判断连通性的IP地址对数量。接下来的 q 行每行包含两个字符串表示需要判断连通性的两个IP地址。 数据结构准备 使用 ipToId 哈希表来映射每个IP地址到其对应的编号。使用 graph 列表来表示图的邻接表其中 graph[i] 存储与编号为 i 的IP地址有直接连通关系的所有其他编号。 图的构建 根据输入构建邻接表 graph表示每个IP地址之间的直接连通关系。 解码过程 对于每对需要判断连通性的IP地址通过 ipToId 查找它们对应的编号。如果其中任意一个IP地址没有找到对应的编号直接输出 -1 表示无法确定连通性。否则使用 BFS广度优先搜索来计算从起始IP地址到目标IP地址的最短路径长度即连通跳数。 输出结果 对每组需要判断连通性的IP地址对输出计算得到的最短连通跳数或者 -1 表示不可达。
以下是完整的Java代码实现
java复制代码import java.util.*;public class Main {private static MapString, Integer ipToId new HashMap();private static ListListInteger 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; // 如果起点和终点相同跳数为0QueueInteger 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地址之间连通性的判断并计算了最短的连通跳数。