【笔试题汇总】华为春招笔试题题解 2024-4-24

这里是paoxiaomo,一个现役ACMer,之后将会持续更新算法笔记系列以及笔试题题解系列
本文章面向想打ICPC/蓝桥杯/天梯赛等程序设计竞赛,以及各个大厂笔试的选手
感谢大家的订阅➕ 和 喜欢💗
有什么想看的算法专题可以私信博主

(本文题面由清隆学长收集)

01.二叉搜索树的构建与查找

问题描述

LYA 是一名计算机专业的学生,最近她正在学习数据结构中的二叉搜索树。二叉搜索树是一种常用的数据结构,它可以实现快速的查找和插入操作。

现在,LYA 有一个由 2 n − 1 2^n-1 2n1 个不同的正整数组成的数列( 1 ≤ n ≤ 10 1 \leq n \leq 10 1n10,且 n n n 为整数)。她想用这些数构建一棵平衡的满二叉搜索树。

二叉搜索树满足以下性质:

  1. 节点的左子树只包含小于当前节点的数。
  2. 节点的右子树只包含大于当前节点的数。
  3. 所有左子树和右子树也必须是二叉搜索树。

例如,对于数列 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] [1, 2, 3, 4, 5, 6, 7] [1,2,3,4,5,6,7],可以构建出如下图所示的满二叉搜索树:

    4/ \2   6/ \ / \
1  3 5  7

现在,给定一个待查找的数,请你帮助 LYA 计算查找该数的路径和结果。

输入格式

第一行包含若干个用空格分隔的正整数,表示给定的数列。

第二行包含一个正整数,表示待查找的数。

输出格式

输出查找的路径和结果。

路径从根节点开始,用 S 表示。查找左子树用 L 表示,查找右子树用 R 表示。查找到结果用 Y 表示,未找到结果用 N 表示。

样例输入 1

2 1 3 7 5 6 4
6

样例输出 1

SRY

样例解释 1

从根节点开始,所以路径的第一部分为 S。待查找数为 6 6 6,大于根节点 4 4 4,所以要查找右子树,路径增加 R,正好找到,因此最后增加 Y。最终输出 SRY

样例输入 2

4 2 1 3 6 5 7
5

样例输出 2

SRLY

样例解释 2

从根节点开始,先查找右子树,再查找左子树,最终找到结果 5 5 5,因此输出 SRLY

样例输入 3

1 2 3 4 5 6 7
8

样例输出 3

SRRN

样例解释 3

从根节点开始查找,标记 S。待查找数 8 8 8 大于根节点 4 4 4,所以查找右子树,标记 R。继续查找右子树,标记 R 8 8 8 比右子树节点 7 7 7 还大,但已经到达叶子节点,没有找到,因此最后标记 N

数据范围

  • 1 ≤ n ≤ 10 1 \leq n \leq 10 1n10
  • 给定的数列中的数互不相同

【题目解析】

这个问题可以通过递归地在二叉搜索树中搜索给定的数来解决。首先,我们需要构建一个平衡的满二叉搜索树,然后再搜索给定的数。

构建平衡的满二叉搜索树可以采用递归的方式,每次选取数列的中间元素作为当前节点,然后递归地构建左右子树。

接下来,我们搜索给定的数,按照二叉搜索树的性质,从根节点开始,如果给定的数比当前节点的值小,就向左子树搜索,如果给定的数比当前节点的值大,就向右子树搜索,直到找到该数或者搜索到空节点为止。

cpp

#include <bits/stdc++.h>using namespace std;// 定义二叉树节点
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 构建平衡的满二叉搜索树
TreeNode* buildBST(vector<int>& nums, int start, int end) {if (start > end) return nullptr;int mid = start + (end - start) / 2;TreeNode* root = new TreeNode(nums[mid]);root->left = buildBST(nums, start, mid - 1);root->right = buildBST(nums, mid + 1, end);return root;
}// 搜索给定的数
string search(TreeNode* root, int target) {if (root == nullptr) return "N";if (root->val == target) return "Y";else if (target < root->val) return "L" + search(root->left, target);else return "R" + search(root->right, target);
}int main() {// 读取输入数据vector<int> nums;int num;while (cin >> num) {nums.push_back(num);if (cin.get() == '\n') break; // 读到换行符结束输入}sort(nums.begin(),nums.end());int target;cin >> target;// 构建平衡的满二叉搜索树TreeNode* root = buildBST(nums, 0, nums.size() - 1);// 搜索给定的数string result = search(root, target);cout<<'S'<<endl;// 输出结果cout << result << endl;return 0;
}

02.球员能力评估

题目描述

K教练正在对足球队的 n n n 名球员进行射门能力评估。评估共进行 m m m 次训练,每次训练时,若球员射门得分则记为1,否则记为0。现在K教练需要根据以下规则对球员进行排名:

  1. 进球总数较多的球员排名靠前。
  2. 如果进球总数相同,则最长连续进球次数较多的球员排名靠前。
  3. 如果最长连续进球次数也相同,则第一次未进球的训练序号较大的球员排名靠前。如果第一次未进球的训练序号也相同,则比较第二次、第三次……直到比较出结果。
  4. 如果按照前三条规则仍然无法区分排名,则编号较小的球员排名靠前。

请你帮助K教练生成一个球员排名。

输入格式

第一行包含两个正整数 n n n m m m,表示参与评估的球员数量和训练次数,球员编号从1到 n n n

第二行包含 n n n 个空格分隔的长度为 m m m 的字符串,第 i i i 个字符串表示编号为 i i i 的球员在这 m m m 次训练中的进球记录。

输出格式

输出一行,包含 n n n 个空格分隔的正整数,表示球员编号按照射门能力从高到低排列的结果。

数据范围

  • 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000
  • 1 ≤ m ≤ 1000 1 \le m \le 1000 1m1000

样例输入

4 5
11100 00111 10111 01111

样例输出

4 3 1 2

样例解释

  • 球员3和球员4的进球总数均为4个,多于球员1和球员2的3个。
  • 球员4的最长连续进球次数为4,大于球员3的3,因此球员4排名第一,球员3第二。
  • 球员1第2次训练时未进球,早于球员2的第1次,因此球员1第三,球员2第四。

【题目解析】

这个问题可以通过自定义比较函数来排序解决。首先,我们需要定义一个结构体来存储球员的信息,包括进球总数、最长连续进球次数以及第一次未进球的训练序号。然后,我们对这些球员进行排序,按照题目中的规则进行比较。

cpp

#include <bits/stdc++.h>using namespace std;// 定义球员结构体
struct Player {int id;int totalGoals;int maxConsecutiveGoals;int firstMissedTraining;// 定义比较函数bool operator<(const Player& other) const {if (totalGoals != other.totalGoals) {return totalGoals > other.totalGoals;} else if (maxConsecutiveGoals != other.maxConsecutiveGoals) {return maxConsecutiveGoals > other.maxConsecutiveGoals;} else if (firstMissedTraining != other.firstMissedTraining) {return firstMissedTraining < other.firstMissedTraining;} else {return id < other.id;}}
};int main() {int n, m;cin >> n >> m;vector<Player> players(n);for (int i = 0; i < n; ++i) {players[i].id = i + 1;players[i].totalGoals = 0;players[i].maxConsecutiveGoals = 0;players[i].firstMissedTraining = m + 1;}for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {char goal;cin >> goal;if (goal == '1') {players[i].totalGoals++;players[i].maxConsecutiveGoals++;} else {players[i].maxConsecutiveGoals = 0;players[i].firstMissedTraining = min(players[i].firstMissedTraining, j + 1);}}}// 排序sort(players.begin(), players.end());// 输出结果for (int i = 0; i < n; ++i) {cout << players[i].id << " ";}cout << endl;return 0;
}

03.微服务调用分析

题目描述

K小姐是一名软件工程师,她正在对公司的 n n n 个微服务进行调用情况分析。这些微服务使用 0 0 0 n − 1 n-1 n1 的整数进行编号。

K小姐得到了一个长度为 n n n 的数组 e d g e s edges edges,其中 e d g e s [ i ] edges[i] edges[i] 表示存在一个从微服务 i i i 到微服务 e d g e s [ i ] edges[i] edges[i] 的调用关系。

如果多个微服务形成了一个环,我们称之为一个微服务群组。对于一个微服务群组,我们定义:

  • L L L 表示该群组内所有微服务的数量。
  • V V V 表示能够调用到该群组内微服务的微服务数量。
  • 该群组的内聚值 H = L − V H = L - V H=LV

已知给定的调用关系数据中至少存在一个微服务群组,请你计算所有群组的内聚值,并按照以下规则对它们进行排序:

  1. 按照内聚值 H H H 从大到小排序。
  2. 如果内聚值相同,则按照群组内最大编号从小到大排序。

最后,请输出排序后的第一个微服务群组,要求从群组内编号最小的微服务开始,按照调用关系的顺序输出其中所有微服务的编号。

输入格式

第一行包含一个正整数 n n n,表示微服务的数量。
第二行包含 n n n 个整数,表示数组 e d g e s edges edges,相邻整数之间用空格分隔。其中 e d g e s [ i ] edges[i] edges[i] 表示存在一个从微服务 i i i 到微服务 e d g e s [ i ] edges[i] edges[i] 的调用关系。

输出格式

输出一行整数,表示内聚值最大的微服务群组,其中微服务编号按照调用关系顺序输出,起始编号为群组内最小编号。相邻整数之间用空格分隔。

数据范围

  • 2 ≤ n ≤ 1 0 5 2 \le n \le 10^5 2n105
  • 0 ≤ e d g e s [ i ] ≤ n − 1 0 \le edges[i] \le n-1 0edges[i]n1
  • e d g e s [ i ] ≠ i edges[i] \neq i edges[i]=i

样例输入1

4
3 3 0 2

样例输出1

0 3 2

样例输入2

12
2 6 10 1 6 0 3 0 5 4 5 8

样例输出2

0 2 10 5

【题目解析】

首先,我们需要编写一个函数来找到所有的微服务群组,并计算它们的内聚值。然后,我们按照规则对这些群组进行排序,并输出内聚值最大的群组。首先定义了一个 ServiceGroup 结构体,用于存储每个微服务群组的信息。然后,使用 findServiceGroups 函数找到所有的微服务群组,并计算它们的内聚值。最后,使用 compareGroups 函数对群组进行排序,并输出内聚值最大的群组。

cpp

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;struct ServiceGroup {int start;int size;int accessible_count;int cohesion;ServiceGroup(int _start, int _size, int _accessible_count) : start(_start), size(_size), accessible_count(_accessible_count) {cohesion = size - accessible_count;}
};// Function to find all service groups
vector<ServiceGroup> findServiceGroups(const vector<int>& edges) {int n = edges.size();vector<bool> visited(n, false);vector<ServiceGroup> groups;for (int i = 0; i < n; ++i) {if (!visited[i]) {int current = i;int group_start = i;int group_size = 0;int accessible_count = 0;while (!visited[current]) {visited[current] = true;group_size++;current = edges[current];}current = group_start;while (visited[current]) {visited[current] = false; // Reset visited flag for next iterationaccessible_count++;current = edges[current];}groups.push_back(ServiceGroup(group_start, group_size, accessible_count));}}return groups;
}// Comparator function for sorting service groups
bool compareGroups(const ServiceGroup& a, const ServiceGroup& b) {if (a.cohesion != b.cohesion) {return a.cohesion > b.cohesion;} else {return a.start < b.start;}
}int main() {int n;cin >> n;vector<int> edges(n);for (int i = 0; i < n; ++i) {cin >> edges[i];}vector<ServiceGroup> groups = findServiceGroups(edges);sort(groups.begin(), groups.end(), compareGroups);// Output the first groupfor (int i = groups[0].start; i < groups[0].start + groups[0].size; ++i) {cout << i << " ";}cout << endl;return 0;
}

整理试题不易,你的关注是我更新的最大动力!关注博主 带你看更多面试及竞赛试题和实用算法。

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

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

相关文章

Docker Registry私有仓库详解

引言 在Docker生态系统中&#xff0c;容器镜像的管理至关重要。Docker公共仓库&#xff08;如Docker Hub&#xff09;为开发者提供了便捷的镜像托管服务&#xff0c;但出于安全、隐私及网络性能的考虑&#xff0c;许多企业和组织更倾向于搭建自己的Docker私有仓库。本文将详细探…

Ubuntu C++ man手册安装及使用

Ubuntu下C++ man手册安装 C++在线文档: http://www.cplusplus.com/reference/ 第一种办法:使用cppman $ sudo apt install cppman 使用方法 第二种办法: 打开网页:GCC mirror sites- GNU Project 点击下图中的突显行链接: Russia, Novosibirsk:

Spring:SpringBoot项目中忽略某属性返回给前端

文章目录 一、忽略实体类中的属性1、JsonIgnore2、JSONField(serialize false)3、JsonInclude 二、忽略实体类中的方法返回值 一、忽略实体类中的属性 1、JsonIgnore JsonIgnore注解是Jackson库中的一个注解&#xff0c;用于在实体类向前台返回数据时忽略不想传递给前台的属…

使用UmcFramework和unimrcpclient.xml连接多个SIP设置的配置指南及C代码示例

使用UmcFramework和unimrcpclient.xml连接多个SIP设置的配置指南及C代码示例 引言1. UniMRCP和UmcFramework简介2. 准备工作3. unimrcpclient.xml配置文件3.1 定义SIP设置3.2 定义MRCP会话配置文件 4. C代码示例5. 测试和验证6. 故障排查7. 结论8. 参考文献 引言 在多媒体通信…

小剧场短剧影视小程序源码_后端PHP

项目运行截图 源码贡献 https://githubs.xyz/boot?app42 部署说明 linux/win任选 PHP版本&#xff1a;7.3/7.2&#xff08;测试时我用的7.2要安装sg扩展 &#xff09; 批量替换域名http://video.owoii.com更换为你的 批量替换域名http://120.79.77.163:1更换为你的 这两个…

微服务之SpringCloud AlibabaSeata处理分布式事务

一、概述 1.1背景 一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用&#xff0c;就会产生分布式事务问题 but 关系型数据库提供的能力是基于单机事务的&#xff0c;一旦遇到分布式事务场景&#xff0c;就需要通过更多其他技术手段来解决问题。 全局事务&#xff1a;…

蓝桥杯单片机之模块代码《秒表》

文章目录 定时器/计数器1.工作原理2.总代码 省赛代码传送门 定时器/计数器 1.工作原理 定时器/计数器是一种能够对内部时钟信号或者外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向CPU提出中断请求&#xff0c;从而实现定时或计数功能的外设。定时器的…

使用 Lua 协程模拟 Golang 的 go defer 编程模式

封装 go 函数 在 使用 Lua 协程处理异步回调函数 中已经介绍 这里简要列下&#xff1a; 封装 go 函数---go 函数创建并启动一个协程 ---param _co_task function 函数原型 fun(_co:thread) function go(_co_task)local co coroutine.create(_co_task) -- 创建的协程是暂停的…

【论文阅读】ChipNeMo中的数据集处理

前面总体学习了《ChipNeMo: Domain-Adapted LLMs for Chip Design》&#xff0c;然后又继续仔细看了论文中的领域适配分词和领域数据微调的预训练检索模型&#xff0c;对于数据集的处理&#xff0c;也需要仔细看一下。 提炼重点&#xff1a;1&#xff09;对于数据集&#xff0…

Golang中的Json标签(持续更新...)

目录 字段标签对应表 字段标签对应表 在Go语言中&#xff0c;结构体&#xff08;struct&#xff09;的字段标签&#xff08;Field Tags&#xff09;通常用于为字段提供额外的元数据&#xff0c;这些元数据可以由反射&#xff08;reflect 包&#xff09;或其他库&#xff08;如…

第1篇:创建Platform Designer系统

Q&#xff1a;本期我们开始使用Platform Designer工具创建带IP核的FPGA自定义硬件系统。 A&#xff1a;Platform Designer是集成在Quartus软件里的系统设计工具&#xff0c;名称随着Quartus的不断更新曾命名为SOPC Builder和Qsys。 使用Platform Designer可以添加Quartus已有自…

安卓数据库SQLite

目录 一、SQLite数据库二、SQLiteOpenHelper和SQLiteDatabase2.1 SQLiteOpenHelper2.2 SQLiteDatabase 三、常见数据库使用介绍3.1 创建数据库3.2 插入数据3.3 修改数据&#xff08;升级数据库&#xff09;3.4 删除数据3.5 查询数据3.6 关闭数据库3.7 删除数据库 一、SQLite数据…

基于uniapp vue3.0 uView 做一个点单页面(包括加入购物车动画和左右联动)

1、实现效果&#xff1a; 下拉有自定义组件&#xff08;商品卡片、进步器、侧边栏等&#xff09;源码 2、左右联动功能 使用scroll-view来做右边的菜单页&#xff0c;title的id动态绑定充当锚点 <scroll-view :scroll-into-view"toView" scroll-with-animation…

OSPF基本配置

原理概述 OSPF 是一种应用非常广泛的基于链路状态的动态路由协议&#xff0c;它具有区域&#xff08; Area )化的层次结构&#xff0c;扩展性好&#xff0c;收敛速度快&#xff0c;适合部署在各种规模的网络上。 在 OSPF 中&#xff0c;每台路由器都必须有一个 Router-I…

Centos 安装python3.12.3

下载python3.12.3 https://www.python.org/downloads/release/python-3123/ 安装 yum -y install gcc zlib zlib-devel libffi libffi-devel yum install readline-devel yum install bzip2-devel yum install epel-release yum install openssl-devel export CFLAGS$(pkg-c…

仓储机器人确实蛮卷的~

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 视频来源于Agilox。 仓储机器人&#xff0c;无疑是现代物流业的一大亮点。它们小巧灵活&#xff0c;却能承担起繁重…

CentOS-Stream-9添加删除账户

添加普通用户&#xff0c;既可以登录系统&#xff0c;也可以访问服务 useradd -s /bin/bash -m abc 添加abc用户&#xff0c;自动创建目录。 passwd abc 设置用户密码 添加不能登录系统的用户&#xff0c;可以访问ftp服务 vim /etc/shells&#xff0c;在其中添加一行/sbin/…

线上线下交友陪玩,支持小程序/app/h5三端打包,源码搭建!

社交APP定制开发的好处&#xff1a; 社交APP定制开发能够根据用户需求进行个性化定制&#xff0c;满足用户对于社交功能的特殊需求。不同用户对社交的理解和需求各不相同&#xff0c;定制开发可以根据用户的要求&#xff0c;提供更加个性化和专属的社交功能&#xff0c;为用户…

Teamcity为Azure的git源颁发ssh-rsa证书,使用ssl-keygen在macos下操作

Teamcity通过git,持续集成Azure源的项目时,总出现最近总出如下类似的错误: failed to checkout and determine revision: unable to list remote for ssh://gitssh.dev.azure.com/v3/<organization_name>/<project_name>/<repo_name>: unknown error: remot…

Zapier 与生成式 AI 的自动化(一)

原文&#xff1a;zh.annas-archive.org/md5/057fe0c351c5365f1188d1f44806abda 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 当组织处理手动和重复性任务时&#xff0c;生产力会遇到重大问题。Zapier 处于无代码运动的前沿&#xff0c;提供了一种先进的工具&a…