笔试:4.6美团笔试(硬件开发方向)

2024-04-06 12:36

本文主要是介绍笔试:4.6美团笔试(硬件开发方向),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二十道选择两道算法题。

选择就不说了,硬件方面目前了解较少。

两道算法题都过了,第一题很简单没有什么好讲的。

第二题看着题目以为会很复杂,没想到一遍过。

小美有一个由 n 个互不相等的正整数构成的数组 a,但她一不小心把 a 弄丢了,他想要重新找到 a。

好在她并不是一无所有,她还记得以下有关 a 的信息:

1. 他完全记得数组 b 的样子,并且 b 是数组 a 删除了某个 a_i 后,剩余的部分做前缀和并打乱的结果。
2. 他完全记得数组 c 的样子,并且 c 是数组 a 删除了某个 a_j 后,剩余的部分做前缀和并打乱的结果。
(保证两次删除的 a_i 和 a_j 不是同一个 a 中的元素)。

请你帮她还原出 a 数组吧。

补充:前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身)。

输入描述
输入包含三行。
第一行一个正整数 n\ (3 \leq n \leq 10 ^ 5),表示数组 a 的长度。
第二行 n - 1 个正整数 b_i\ (1 \leq b_i \leq 10 ^ {14}),表示题中所述数组 b。
第二行 n - 1 个正整数 c_i\ (1 \leq c_i \leq 10 ^ {14}),表示题中所述数组 c。
(输入保证有唯一解)

输出描述
输出一行 n 个整数,表示你还原出的 a 数组。
4
8 18 14
15 9 1
输出

1 8 6 4
说明
b 数组是 a 中删除了 a[1] 后,求前缀和,再打乱得到的。
c 数组是 a 中删除了 a[4] 后,求前缀和,再打乱得到的。

思路:所谓前缀和,一定是递增的,所以题目中把打乱了完全没有用,通过排序就可以找回打乱前的数组。然后从后往前用当前前缀和减去前一个前缀和即可得到当前数字。两次操作后我们就得到了b和c的原始数组,即删除了一个a中数字的数组。

注意:此时的b,c数组和a的顺序完全一样,只是删除了一个数字。利用这一点我们才可以按照正确的顺序求出a数组。

接下来只需要找到被删除的那个数字并且插入原来数组即可。

接下来使用两个指针指向b,c,如果指针值相等则判断下一个,如果不等则说明在当前位置b,c中有一个删除了a中的一个数字。在删除的数组中,当前指针所指的数据必然为另一个数组中下一个数据(关于这点下面详细解释),将另一个数组中的数据插入删除的数组即可。举个例子1,2,3,4,5,删除2、4,自己想一想就知道了。

关于上面的解释:题目说保证有唯一解,所以删除的两个数字必然不可能连续,如果连续,则我们不可能知道这两个数字在原数组中的顺序,不知道谁先谁后。所以如果发现当前数组中被删了一个数字,那么下一个一定没有被删,两数组中一定都有该数字,只需要通过一个判断与下一个数字比较看哪个数组被删除了即可。

#include<bits/stdc++.h>
using namespace std;int main()
{int n;cin >> n;vector<long long>a(n), b(n - 1), c(n - 1);for (int i = 0; i < n - 1; i++){cin >> b[i];}for (int i = 0; i < n - 1; i++){cin >> c[i];}sort(b.begin(), b.end());sort(c.begin(), c.end());for (int i = n - 2; i >= 1; i--){b[i] = b[i] - b[i - 1];c[i] = c[i] - c[i - 1];}int pb = 0, pc = 0;while (pb < n - 1 && pc < n - 1){if (b[pb] == c[pc]){pb++;pc++;continue;}if (b[pb + 1] == c[pc]){c.insert(c.begin() + pc, b[pb]);break;}else if (c[pc + 1] == b[pb]){b.insert(b.begin() + pc, c[pc]);break;}else{}}if (b.size() == n){for (int i = 0; i < n; i++){cout << b[i] << ' ';}}else if (c.size() == 0){for (int i = 0; i < n; i++){cout << c[i] << ' ';}}else{}
}

这篇关于笔试:4.6美团笔试(硬件开发方向)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879903

相关文章

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

一文教你如何解决Python开发总是import出错的问题

《一文教你如何解决Python开发总是import出错的问题》经常朋友碰到Python开发的过程中import包报错的问题,所以本文将和大家介绍一下可编辑安装(EditableInstall)模式,可... 目录摘要1. 可编辑安装(Editable Install)模式到底在解决什么问题?2. 原理3.

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3