【笔试题汇总】华为春招笔试题题解 2024-3-20

news/2024/10/18 15:14:18/

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

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

01.K小姐的魔法药水

问题描述

K小姐是一位魔法师,她最近在研究一种神奇的魔法药水。这种药水由一系列魔法材料制成,每种材料都有一个正整数的魔法值。K小姐按照特定的规则将这些材料混合:每次她加入一种新的材料时,如果这种材料的魔法值与当前药水最上层材料的魔法值相同,她会取出这两种材料,将它们的魔法值相加后乘以 2 2 2,然后放回一种新的材料。此外,如果最上层材料的魔法值等于下面连续几种材料魔法值之和,她同样会取出这些材料,进行相同的操作。如果这两个条件都不符合,她就会简单地将新的材料加入到药水的最上层。

现在,K小姐按照一定顺序加入了一系列材料,请你计算最终药水中从上到下各层材料的魔法值。

输入格式

输入为一行,包含若干个由空格分隔的正整数,表示K小姐按顺序加入药水中的材料的魔法值。

输出格式

输出为一行,包含若干个由空格分隔的正整数,表示最终药水中从上到下各层材料的魔法值。

样例输入

55 66 121 5 5

样例输出

10 242

数据范围

  • 每个正整数的范围为 1 1 1 2 31 − 1 2^{31}-1 2311
  • 正整数的个数范围为 1 1 1 1000 1000 1000

【题目解析】

我们使用栈来模拟药水的层叠过程。
1,依次读取输入的魔法值,如果当前魔法值与栈顶元素不相同,则将其压入栈中。
2,如果当前魔法值与栈顶元素相同,则取出栈顶元素,将其魔法值乘以2,直到栈顶元素与当前魔法值不相同或栈为空。
最后,依次从栈中取出元素,按照从上到下的顺序输出它们的魔法值。

cpp

#include <iostream>
#include <vector>
#include <stack>using namespace std;int main() {stack<int> magicStack;int magic;while (cin >> magic) {if (magicStack.empty() || magic != magicStack.top()) {magicStack.push(magic);} else {int currentMagic = magicStack.top();magicStack.pop();while (!magicStack.empty() && magicStack.top() == currentMagic) {currentMagic *= 2;magicStack.pop();}magicStack.push(currentMagic);}}vector<int> result;while (!magicStack.empty()) {result.push_back(magicStack.top());magicStack.pop();}for (int i = result.size() - 1; i >= 0; --i) {cout << result[i];if (i != 0) {cout << " ";}}return 0;
}

02.K小姐安排座位

题目描述

K小姐是一名列车长,她负责管理一列从北京开往上海的列车。这列火车共有 m m m 个座位,途径 n n n 个站点(编号从 0 0 0 n − 1 n-1 n1)。在发车前,已经有 x x x 名乘客预定了座位。

为了让列车的运营效率最大化,K小姐需要合理安排乘客的座位。她定义了一个指标叫做"座位利用数",即每个座位被使用的站数之和。例如,某列车有 2 2 2 个座位,第一个座位从第 0 0 0 站到第 10 10 10 站都有人坐(即从第 0 0 0 站上车,第 10 10 10 站下车,第 10 10 10 站本身不占座,利用数为 10 − 0 = 10 10-0=10 100=10),第二个座位从第 1 1 1 站到第 9 9 9 站都有人坐,则总的座位利用数为 ( 10 − 0 ) + ( 9 − 1 ) = 18 (10-0)+(9-1)=18 (100)+(91)=18

现在,K小姐希望设计一个算法,计算出如何分配座位,才能使得座位利用数最大。同时,她需要保证在任意时刻,列车上的乘客数都不超过座位数 m m m。乘客下车后,其他乘客可以立即使用该座位,不用考虑换座的问题。

你能帮助K小姐完成这个任务吗?

输入格式

第一行包含三个正整数 m , n , x m,n,x m,n,x,分别表示列车的座位数、经停站点数和预定乘客数。

接下来 x x x 行,每行包含两个整数 u i , v i u_i,v_i ui,vi,表示第 i i i 位乘客的上车站点编号和下车站点编号。

输出格式

输出一个整数,表示最大的座位利用数。

样例输入

2 11 4
0 1
1 9
0 10
3 8

样例输出

19

数据范围

  • 1 ≤ m ≤ 9 1 \le m \le 9 1m9
  • 2 ≤ n ≤ 20 2 \le n \le 20 2n20
  • 1 ≤ x ≤ 9 1 \le x \le 9 1x9
  • 0 ≤ u i < v i ≤ n − 1 0 \le u_i < v_i \le n-1 0ui<vin1

【题目解析】

这道题的目标是设计一个算法,以最大化列车座位的利用数。具体要求是在保证任意时刻列车上的乘客数不超过座位数的前提下,安排乘客的座位。我们需要一个数据结构来记录每个座位的使用情况。由于座位是按顺序的,可以使用一个数组或向量来表示每个座位的利用情况。然后,我们可以遍历每位乘客的上车和下车站点,更新座位的利用情况。首先读取输入的列车座位数、经停站点数和预定乘客数。然后,它创建一个长度为座位数的向量 seatUtilization 来记录每个座位的利用情况,并将其初始化为全 0。接下来,它遍历每位乘客的上车和下车站点,更新每个座位在乘客乘坐期间的利用情况。最后,它计算总的座位利用数并输出。

cpp

#include <iostream>
#include <vector>using namespace std;int main() {int m, n, x;cin >> m >> n >> x;// 记录每个座位的利用情况,初始化为 0vector<int> seatUtilization(m, 0);// 输入每位乘客的上车和下车站点for (int i = 0; i < x; ++i) {int u, v;cin >> u >> v;// 更新每个座位的利用情况for (int j = u; j < v; ++j) {seatUtilization[j]++;}}// 计算总的座位利用数int totalUtilization = 0;for (int utilization : seatUtilization) {totalUtilization += utilization;}cout << totalUtilization << endl;return 0;
}

03.K小姐的魔法材料

问题描述

K小姐是一位魔法师,她正在研究一些魔法材料。这些材料之间存在着一些依赖关系,一种材料可以依赖于多种其他材料(不包括自己,被依赖的材料不会重复),一种材料也可以被多种材料所依赖。

在这些依赖关系中,总是存在唯一的循环依赖。K小姐想要找出这个循环依赖,你能帮助她吗?

输入格式

第一行包含一个正整数 N N N,表示依赖关系的个数。

接下来 N N N 行,每行表示一个依赖关系,包含若干个由空格分隔的正整数。第一个数 n n n 表示后面有 n n n 个材料,第二个数为材料编号 a a a,后面 n − 1 n-1 n1 个数为 a a a 所依赖的材料编号。任意材料编号 i i i 满足 0 < i < 10000 0 < i < 10000 0<i<10000

输出格式

输出一行,包含若干个由空格分隔的正整数,表示找到的循环依赖。从最小的材料编号开始,按照依赖关系顺序输出,以最小的材料编号结束。

样例输入

3
3 1 2 5
3 2 3 4
2 3 1

样例输出

1 2 3 1

数据范围

  • 1 ≤ N ≤ 10000 1 \le N \le 10000 1N10000
  • 0 < i < 10000 0 < i < 10000 0<i<10000

【题目解析】

这个问题可以使用拓扑排序来解决。我们可以先构建一个有向图,其中材料之间的依赖关系可以表示为有向边。然后,我们对这个有向图进行拓扑排序,找到循环依赖的起点。首先读取输入的依赖关系个数 N,并读入每个依赖关系。然后,它构建一个有向图,表示材料之间的依赖关系,并找到起点节点。接下来,它对这个有向图进行拓扑排序,找到循环依赖的起点,并输出循环依赖路径。

cpp

#include <iostream>
#include <vector>
#include <unordered_map>
#include <queue>using namespace std;// 有向图的节点
struct Node {int val;vector<Node*> neighbors;Node(int x) : val(x) {}
};// 构建有向图
Node* buildGraph(unordered_map<int, Node*>& graph, vector<vector<int>>& dependencies) {for (auto& dependency : dependencies) {int dependent = dependency[0];for (int i = 1; i < dependency.size(); ++i) {int dependee = dependency[i];if (!graph.count(dependent)) graph[dependent] = new Node(dependent);if (!graph.count(dependee)) graph[dependee] = new Node(dependee);graph[dependee]->neighbors.push_back(graph[dependent]);}}return graph[dependencies[0][0]]; // 返回任意一个节点作为起始节点
}// 拓扑排序
vector<int> topologicalSort(Node* start) {vector<int> result;queue<Node*> q;unordered_map<Node*, int> indegree;// 计算每个节点的入度q.push(start);while (!q.empty()) {Node* node = q.front();q.pop();for (Node* neighbor : node->neighbors) {indegree[neighbor]++;q.push(neighbor);}}// 拓扑排序q.push(start);while (!q.empty()) {Node* node = q.front();q.pop();result.push_back(node->val);for (Node* neighbor : node->neighbors) {if (--indegree[neighbor] == 0) {q.push(neighbor);}}}return result;
}int main() {int N;cin >> N;// 读入依赖关系vector<vector<int>> dependencies(N);for (int i = 0; i < N; ++i) {int n;cin >> n;vector<int> dependency(n);for (int j = 0; j < n; ++j) {cin >> dependency[j];}dependencies[i] = dependency;}// 构建有向图并找到起点unordered_map<int, Node*> graph;Node* startNode = buildGraph(graph, dependencies);// 拓扑排序vector<int> result = topologicalSort(startNode);// 输出循环依赖for (int val : result) {cout << val << " ";}cout << endl;return 0;
}

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


http://www.ppmy.cn/news/1447644.html

相关文章

Python.第六章(函数)

# 第六章 函数# 在Python语言中&#xff0c;定义函数的语法格式如下: # def 函数名([参数列表]): # 函数体# [注意] # (1)圆括号内是形参列表&#xff0c;如果有多个参数则使用逗号分隔开&#xff0c; # 即使该函数 # 不需要接收任何参数&#xff0c;也必须保留一对空的圆…

[论文笔记]Language Modeling with Gated Convolutional Networks

引言 今天带来论文Language Modeling with Gated Convolutional Networks的笔记&#xff0c;该篇工作提出了GLU(Gated Linear Units&#xff0c;门控线性单元)。 注意该篇工作是2016年发表&#xff0c;是在Transformer论文发表之前。当时作者认为语言建模的主要方法是基于循环…

Centos 7 安装 Redis

Centos 7 安装 Redis 安装步骤1、安装软件源2、安装redis3、创建符号链接4、修改配置文件5、启动 redis6、停止redis 安装步骤 1、安装软件源 如果是Centos 8 直接yum install 就可以了 yum install -y redis但是如果是Centos 7&#xff0c;redis 默认的是 redis 3 系列&…

数据结构四:线性表之带头结点的单向循环链表的设计

前面两篇介绍了线性表的顺序和链式存储结构&#xff0c;其中链式存储结构为单向链表&#xff08;即一个方向的有限长度、不循环的链表&#xff09;&#xff0c;对于单链表&#xff0c;由于每个节点只存储了向后的结点的地址&#xff0c;到了尾巴结点就停止了向后链的操作。也就…

解决Uncaught TypeError: Cannot read properties of null (reading ‘getAttribute‘)

问题&#xff1a; 用了element ui 的echart ,初始化时候找不到指定id的元素&#xff0c;导致的问题&#xff0c;如下 浏览器控制台输出的错误信息如下 Echars echarts.min.js:22 Uncaught TypeError: Cannot read properties of null (reading getAttribute)at echarts.min.…

hadoop的相关操作

一.hadoop与hadoop生态圈 Apache Hadoop:是一款分布式开源应用程序,主要解决海量数据的存储和分布式计算问题 Hadoop生态圈:是更广泛的概念,包含hadoop,sqoop,flume,zookeeper,hive,spark,hbase,oozie等构成的大数据处理相关一系统组件 hadoop版本介绍 hadoop1.x的组成: Common…

神经网络的反向传播

梯度下降算法 &#x1f525;我们来看一下神经网络中的梯度下降算法&#x1f525; 梯度下降法是一种优化算法&#xff0c;用于寻找目标函数的最小值。梯度是一个向量&#xff0c;表示某一函数在该点处的方向导数沿着该方向取得最大值&#xff0c;即函数在该点处变化最快的方向…

scala基础学习--变量,标识符,类型和类型转换

一、基本学习 1、输出语句和分号 1.换行输出 println&#xff08;打印数据&#xff09;2.不换行输出 print(打印数据)3.分号使用 在多个打印在一行中间的分号必须写&#xff0c;末尾可以不写 2、Scala中常量 常量是指&#xff1a;在程序发生变化过程中&#xff0c;不会发…