美团2024秋招第二场笔试[测开方向]0817详细解析C++代码

本文主要是介绍美团2024秋招第二场笔试[测开方向]0817详细解析C++代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三道题目1.5小时

  • 小美送外卖
  • 最大公约数是不是素数
  • 数组的极差

小美送外卖

小美在处理外卖订单的时候,遇到一个任务,需要判断一个给定的字符串是否符合特定的分类规则,具体来说,需要判断一个字符串是否是一个有效的电子邮箱,IP地址或者电话号码。

  • 电子邮件地址的格式为:username@domain.com,其中 username 和 domain 只能包含字母、数字和下划线。
  • IP 地址的格式为:xxx.xxx.xxx.xxx,其中 xxx 是 0 到 255 之间的整数。
  • 电话号码的格式为:+国家码-区号-号码 ,其中 国家码 和 区号 只能包含数字,号码 可以包含数字和’#’。

**输入:**第一行包含数据组数n,接下来n行,每一行输入一个需要判断的字符串
**输出:**对于每一行,输出判断的结果,如果是有效的电子邮箱,输出email;如果是有效的IP地址,输出ip;如果是有效的电话号码,输出phone;如果都不是,输出invalid

美团容易出这种模拟题,但是不可以轻易小瞧
这题逻辑复杂,可以使用正则表达式来检查字符串是否符合给定的格式:电子邮件地址、IP 地址或电话号码。

首先了解一下常用的正则表达式语法:

字符含义
^匹配字符串的开始
$匹配字符串的结束
[a-z]匹配一个小写字母
[A-Z]匹配一个大写字母
[0-9]匹配一个数字
+匹配前一个字符一次或多次
*匹配前一个字符0次或多次
.匹配任意字符,除了换行符
\\.匹配一个.,因为.在正则表达式中是特殊字符,所以需要转义
\\d特殊字符类,用于匹配任意一个数字字符,即0-9之间任意数字
{m, n}匹配前一个字符至少m次,至多n次

根据以上语法可以写出电子邮箱ip地址和手机号的正则表达式:

  1. 电子邮箱验证
regex pattern("^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\\.com$")

^[a-zA-Z0-9_]+:匹配以字母、数字或下划线开始的字符串,至少一个字符。
@:匹配@符号
[a-zA-Z0-9_]+:匹配 @ 后面的部分,与前面相同。
\\.:匹配.,因为.在正则表达式中是特殊字符,所以需要转义。
com$:匹配.后面的com,并且确保这个是字符串的结尾。

  1. IP地址验证
regex pattern("^(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.
(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.
(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.
(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$");

一个多余的空格都不要有!!!

其中(\d{1,2}|1\d{2}|2[0-4]\d|25[0-5]):这个分组表达式用于匹配 0 到 255 之间的整数。
为什么会这么长呢,因为0-255有好几种情况,1位数,两位数和三位数,每一种情况都要覆盖到
\\d{1,2}是匹配1到2位的数字即,0~99。
1\\d{2},1开头,再加上随机两位数,匹配100~199
2[0-4]\\d,2开头,第二位数0-4之间随机取,最后第三位随机0-9
25[0-5],25开头,最后一位数在0-5之间随机
四种情况通过’|'或连接

  1. 电话号码验证
regex pattern("^\\+\\d+-\\d+-[\\d#]+$");

\\+ ,匹配一个+号,以+开头
\\d+,匹配至少一个随机数字
-,匹配 ‘-’ 符号
[\\d#]+,匹配数字或者#符号,至少一个

stoi作用:将字符串转换成整数,并且会自动忽略前导0

完整代码:

#include <iostream>
#include <regex>
#include <vector>
using namespace std;
bool isEmail(string str) {regex pattern("^([a-zA-Z0-9_]+@[a-zA-Z0-9_]+\\.com$)");return regex_match(str, pattern);
}
bool isIP(string str) {regex pattern("^(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])\\.(\\d{1,2}|1\\d{2}|2[0-4]\\d|25[0-5])$");return regex_match(str, pattern);
}
bool isPhone(string str) {regex pattern("^\\+\\d+-\\d+-[\\d#]+$");return regex_match(str, pattern);
}
int main() {int n;cin >> n;vector<string> res;while (n--) {string input;cin >> input;if (isEmail(input)) res.push_back("email");else if (isIP(input)) res.push_back("ip");else if (isPhone(input)) res.push_back("phone");else res.push_back("invaild");}for (string r : res) {cout << r << endl;}return 0;
}

最大公约数是不是素数

小美对 gcd (最大公约数) 很感兴趣,她会询问你t次。
每次询问给出一个大于1的正整数n,你是否找到一个数字 m (2 ≤ m ≤ n),使得 gcd(n,m)为素数。

**输入:**每个测试文件均包含多组测试数据,第一行输入一个整数T,代表数据组数,每组测试数据描述如下:
在一行上输入一个整数n代表给定的数字
**输出:**对于每一组测试数据,在一行上输出一个整数,代表数字m。 如果有多种合法答案,您可以输出任意一种。

要找的m在2~n之间,所以,暴力穷举即可,每一个都试一下。
计算两个数的最大公约数:

int gcd(int a, int b){return b ? gcd(b, a % b) : a;

检查一个数是否为素数

bool isPrime(int num){//1不是素数,最小的素数是2if(num < 2) return false;for(int i = 2; i < num / i; i ++){if(num % i == 0) return false;return true;

完整代码:

#include<iostream>
#include<vector>
using namespace std;
int gcd(int a, int b) {return b ? gcd(b, a % b) : a;
}
bool isPrime(int num) {if (num < 2) return false;for (int i = 2; i < num / i; i++) {if (num % i == 0) return false;}return true;
}
int main() {int T;cin >> T;vector<int> res;while (T--) {int n;cin >> n;bool flag = false;for (int m = 2; m <= n; m++) {int gcdVal = gcd(n, m);if (isPrime(gcdVal)) {res.push_back(m);flag = true;break;//找到一个即可!}}if (!flag) res.push_back(-1);//没找到的话输入-1}for (int r : res) {cout << r << endl;}return 0;
}

数组的极差

小美有一个长度为 n 的数组,每次操作可以选择两个下标i和 j,将 ai 减去 1,将 aj 加上 1。小美想知道最少需要多少次操作,可以使数组极差最小。

数组的极差为数组中最大值和最小值的差。

输入:第一行输入一个整数n(2 ≤ n ≤ 10^5),代表数组长度;第二行输入几个整数a1,a2…(1 ≤ ai ≤ 10^9) 代表数组元素
输出:输入几个整数a1,a2…代表数组的元素

应考虑将所有元素调整到一个共同的目标值上,这个目标值最接近整个数组的平均值。由于每次操作是将一个元素减去 1,另一个元素加上 1,这意味着数组的总和在操作前后保持不变。因此,最佳策略是尝试使所有元素达到数组总和除以数组长度的结果(向下取整的结果),即平均值。

#include<iostream>
#include<vector>
using namespace std;
int main() {int n;cin >> n;vector<long long> a(n);long long sum = 0;for (int i = 0; i < n; i++) {cin >> a[i];sum += a[i];}long long avg = sum / n;long long minMoves = 0;long long need = 0;for (int i = 0; i < n; i++) {need += a[i] - avg;minMoves = max(minMoves, abs(need));//更新最大操作次数}cout << minMoves << endl;return 0;
}

这篇关于美团2024秋招第二场笔试[测开方向]0817详细解析C++代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名