文章目录

  • 1. 小美剪彩带
  • 2. 最多修改两个字符,生成字典序最小的回文串
  • 美团面试手撕题

1. 小美剪彩带


题意:找出区间内不超过k种数字子数组的最大长度

使用双指针的方式,用哈希表来统计每个数出现次数。在双指针移动的过程中,动态的维护区间内不同数个数。具体的,当右端点遇到一个新的数时map的记录+1,当左端点删去一个只出现一次的数时map的记录-1,在这个过程中统计窗口最大值即可

首先用r指针不断往map中添加数据,直到map中的数据多于k个,此时让mp.size() = k + 1的元素4已经放入了mp,且r又++了(此时元素5还没放入map),不算map中最后放入的那个元素,map正好存放的是存放k种数字的所有元素

即r-1指向让mp.size() = k + 1的元素,r - 2指向最后一个让mp.size() = k的元素,需要计算 [l,r - 2] 区间长度

map中数据过多后,l指针右移,直到区间内数据不大于k,如此往复直到r越界

当r不断向右移动的过程中,若map没有先满,而是r越界了,此时情况不一样,需要记录的 [l,r - 1] 区间长度

#include<iostream>
#include<vector>
#include<unordered_map>using namespace std;int main() {int n, k;cin >> n >> k;if (k == 0) return 0;vector<int> nums(n, 0);for (int i = 0; i < n; i++) cin >> nums[i];int l = 0;int r = 0;int ans = 0;unordered_map<int, int> mp;  // <val, freq>while (r < n) {while (r < n && (int)mp.size() <= k) {mp[nums[r]]++;r++;}if ((int)mp.size() > k) {// 如果是因为mp装入太多数了,导致已经大于k了,退出while// 说明让mp.size() = k + 1的nums[r]已经放入了mp,且r又++了,需要减去1ans = max(ans, r - l - 1);}else {// 肯定是因为r == n了,mp.size()依然<=k,[l, r)区间内都是满足的ans = max(ans, r - l);break;}while (l <= r && (int)mp.size() > k) {mp[nums[l]]--;if (mp[nums[l]] == 0) mp.erase(nums[l]);l++;}}cout << ans << endl;return 0;
}

map中始终存放[l,r]区间内的数据,mp.size() <= k时不断右移 r 指针,mp.size()一旦大于k,就需要右移 l 指针

int main() {int n, k;cin >> n >> k;if (k == 0) return 0;vector<int> nums(n, 0);for (int i = 0; i < n; i++) cin >> nums[i];int l = 0;int r = 0;int ans = 0;// <val, freq>// 始终存放[l,r]区间内的数据,mp.size()一旦大于k,就需要移动l指针unordered_map<int, int> mp;  while (r < n) {mp[nums[r]]++;while (mp.size() > k) {mp[nums[l]]--;if (mp[nums[l]] == 0) mp.erase(nums[l]);l++;}ans = max(ans, r - l + 1);r++;}cout << ans << endl;return 0;
}

2. 最多修改两个字符,生成字典序最小的回文串


由于字符串经过修改一定为回文串,且最多修改两次,所以原字符串位置i与对称位置n-i-1不一样的个数最多为2。所以统计一下需要改的位置个数,记为cnt

  1. cnt=0,即原字符串就是回文串,找到第一个不为a的位置i,将i与对称位置n-i-1都改为a
aca      ---> aaa
acca     ---> aaaa
acbca    ---> aabaa
  1. cnt=1,只有一个位置需要修改,此时分两种情况

    • 如果 i与对称位置n-i-1都不是a,将这俩位置都改为a即可
    • 如果 i与对称位置n-i-1只有一个为a,将另一个不是a的改为a。此时只改了一个字母,还可以改一个。当字符串长度为奇数时,将中间字符改为a
abcdba  ---> abaaba
abcea   ---> aacaa
cbcac   ---> caaac
  1. cnt=2,两个对称位置需要修改, i与对称位置n-i-1,谁小就改为谁
abcde  ---> abcba
int main() {string s;cin >> s;int n = s.size();vector<int> idxs;for (int i = 0; i < n / 2; i++) {if (s[i] != s[n - 1 - i]) {idxs.push_back(i);}}int cnt = idxs.size();if (cnt == 0) {// 本身就是回文串,需要找到第一个不是a的地方修改for (int i = 0; i <= n / 2; i++) {if (s[i] != 'a') {s[i] = 'a';s[n - 1 - i] = 'a';break;}}}else if (cnt == 1) {// 只有一个需要修改的地方if (s[idxs[0]] != 'a' && s[n - 1 - idxs[0]] != 'a') {// 如果对称位置都不是a,则两个都改为as[idxs[0]] = 'a';s[n - 1 - idxs[0]] = 'a';}else {// 如果只有一个为a,则修改不是a的那个// 如果当前串为奇数,还要修改中间位置的为as[idxs[0]] = 'a';s[n - 1 - idxs[0]] = 'a';if (n & 1) {s[n / 2] = 'a';}}}else {// 有两个需要修改的地方,当前位置idxs[i]和对称位置n - 1 - idxs[i],谁小就改为谁for (int i = 0; i < cnt; i++) {char c = min(s[idxs[i]], s[n - 1 - idxs[i]]);s[idxs[i]] = c;s[n - 1 - idxs[i]] = c;}}cout << s << endl;return 0;
}

美团面试手撕题

重叠:矩形重合面积大于0

给出矩形的坐标和权值,如果有矩形重叠了,则删除权值较小的矩形,矩形重叠时若权值相同,则删除靠右的矩形。应保留尽可能多的矩形,使得最终剩下的矩形全都不重叠(如果权值大的矩形和两个权值小的矩形重叠,而两个小矩形不重叠,则应该删除两个权值小的矩形)

首先确定当前矩形中权值最大的矩形肯定不会被删除,用权值最大的矩形和剩下的所有矩形比较,重叠则删除,不重叠则保留。首先将当前权值最大的矩形放到ans中,然后用ans最后一个矩形和其他矩形比较,确定需要保留下来的矩形,然后把保留下来矩形的第一个存入ans,接下来再用ans最后一个矩形和保留下来的矩形比较,再确定需要保留下来的矩形…

判断矩形重叠时,将两个矩形映射到x和y轴上,比较x和y轴上两条线段的关系,不重叠有四种情况,剩下就是重叠的情况

class Cmp {public:bool operator()(pair<int, vector<int>> rec1, pair<int, vector<int>> rec2) {if(rec1.first != rec2.first){// 权值降序return rec1.first > rec2.first;}// 左下角的横坐标升序return rec1.second[0] < rec2.second[0];}
};// vector中存放左下和右上的横纵坐标
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {if (rec2[0] >= rec1[2] || rec2[2] <= rec1[0]) return false;if (rec2[1] >= rec1[3] || rec2[3] <= rec1[1]) return false;return true;
}// 权值和坐标
vector<pair<int, vector<int>>> fun(vector<pair<int, vector<int>>> Rectangles) {vector<pair<int, vector<int>>> ans;if (Rectangles.empty()) return ans;sort(Rectangles.begin(), Rectangles.end(), Cmp());ans.push_back(Rectangles[0]);Rectangles.erase(Rectangles.begin());while (!Rectangles.empty()) {int n = Rectangles.size();vector<int> save;for (int i = 0; i < n; i++) {if (!isRectangleOverlap((ans.end() - 1)->second, Rectangles[i].second) ){save.push_back(i); // 和ans最后一个不重合,则保留下来}}vector<pair<int, vector<int>>> tmp;for (int i : save) {// tmp存放需要保留下来的矩形tmp.push_back(Rectangles[i]);}tmp.swap(Rectangles);if (!Rectangles.empty()) {ans.push_back(Rectangles[0]);Rectangles.erase(Rectangles.begin());}}return ans;
}

【2023.3.18 美团校招】相关推荐

  1. 美团校招-2023.3.18.10点-第四题-商店-困难

    商店 Problem Description 在商店里有N个物品,每个物品有原价和折扣价小美相要购买商品.小美拥有X元,一共Y张折扣券.小美需要最大化购买商品的数量,并在所购商品数量尽量多的前提下,尽 ...

  2. 美团校招-2023.3.18.10点-第一题-小美抓敌人-简单

    小美抓敌人 Problem Description 小美在玩一项游戏.该游戏的目标是尽可能抓获敌人. 敌人的位置将被一个二维坐标(x,y)所描述. 小美有一个全屏技能,该技能能一次性将若干敌人一次性捕 ...

  3. 美团校招php笔试题,【美团点评】2020校招数据分析方向笔试题

    这几天做了下美团校招的一些套题.(只写了编程,这两天慢慢更新吧) 这套题还是蛮简单的..我暴力了好几个都能过.一个小时多一点差不多能写完. 4.棋子翻转 题意:在4*4的棋盘上摆满了黑白棋子,黑白两色 ...

  4. 【美团校招笔试题】去除字符串首尾空格,中间多个空格只保留一个

    要求: 这是本人参加美团校招在线考试笔试题,如果此行为违反了美团校招笔试题商业保密性,请与本人联系. 思路:用一个while循环扫描整个字符串,用pStart字符指针指向整个字符串首地址,如果遇到首部 ...

  5. # Day3 2023.3.18

    Day3 2023.3.18 一.查询命令帮助信息 1.command --help 2.man command 二.文件和目录常用命令 ls ls 类似于DOS下的dir 以. 开头的文件为隐藏文件 ...

  6. 2023美团校招笔试(8.6)

    https://www.nowcoder.com/discuss/385404105085251584?sourceSSR=search 题意:初始字符串s为"Meituan",会 ...

  7. 2023届互联网大厂校招薪资曝光,如何拿到大厂offer?

    说起年轻人的理想公司,互联网大厂一定榜上有名!如今,2023年春招已经正式打响,陆续各大厂的校招薪资都出炉了.今天就带大家逐一看看,各个大厂的2023届校招薪资究竟是多少? 腾讯: 技术岗(含算法岗. ...

  8. 2023届互联网大厂校招薪资流出,大部分年薪20w-50w之间

    说起年轻人的理想公司,互联网大厂一定榜上有名!如今,2023年春招已经正式打响,陆续各大厂的校招薪资都出炉了.今天,小说哥就带大家逐一看看,各个大厂的2023届校招薪资究竟是多少? 腾讯: 技术岗(含 ...

  9. 美团校招年薪35万!老员工薪资倒挂,如何应对?

    职场&认知洞察 丨 作者 / findyi 这是findyi公众号分享的第88篇原创文章 十月底了,今年的秋招即将结束,各个公司的薪资也大都水落石出了. 而美团突然登上了知乎热搜. 原因是&q ...

最新文章

  1. Github-Hexo-theme-NexT
  2. 查看pg 用户组_PostgreSQL 角色管理
  3. Elasticsearch 动态添加mapping
  4. 企业c语言的编程风格,c语言优秀编程风格.docx
  5. 【Ubuntu-Opencv】Ubuntu14.04 Opencv3.3.0 完整卸载方案
  6. Python-cvxopt库的使用(2)(解决QP问题)
  7. background-origin:规定 background-position 属性相对于什么位置来定位
  8. Docker安装及配置镜像加速器
  9. 金蝶kis云+sqlserver报表分析
  10. java lambda表达式学习笔记
  11. 硬盘文件系统系列之FAT
  12. Android中跳转到系统设置界面
  13. Implicit Neural Representations with Periodic Activation Functions
  14. 第十五天 11-常见的网络相关命令
  15. js计算时间差(相差多少分钟)(时分)
  16. 解决XUI 1.1.7版本报错问题:gradle因umeng仓库配置失效,导致编译出错
  17. Mybatis的5种分页方式
  18. 零点起飞学Visual Basic pdf
  19. 中软国际首届嘉年华晚会 创新网络年会PK“春晚”
  20. Informatica任务卡在timeout based commit point

热门文章

  1. OpenGL 实验一 绘制简单图形
  2. android手机联调,Android第三课 联调华为手机
  3. APP登录功能的Java服务端开发
  4. 解决Mysql 主从或主主报1032错误
  5. LabVIEW使用VI Server的时候出现1003错误
  6. 目标检测YOLO实战应用案例100讲-基于激光雷达点云的三维目标检测算法研究
  7. GridView合并单元格求和方法
  8. 2020蓝桥杯省赛B组C++(第二场)真题
  9. 汽车充电桩检测设备TK4860C交流充电桩检定装置
  10. 软件分类(自由软件、开放源代码软件、公共软件......)