2023暑期实习-笔试-美团-技术综合-算法策略方向

公司:美团

形式:编程题 4 道、选择题 3 道

笔试平台:赛码

时长:120分钟

时间:2023-03-18 10:00-12:00

编程题

捕获

描述

小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。敌人的位置将被一个二维坐标 (x,y) 所描述。小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。捕获的敌人之间的横坐标的最大差值不能大于 A,纵坐标的最大差值不能大于 B。现在给出所有敌人的坐标,你的任务是计算小美一次性最多能使用技能捕获多少敌人。

输入描述

第一行三个整数 N,A,B,表示共有 N 个敌人,小美的全屏技能的参数 A 和参数 B。接下来 N 行,每行两个数字,描述一个敌人所在的坐标。

1≤N≤500, 1≤A,B≤1000, 1≤x,y≤1000

输出描述

一行,一个整数表示小美使用技能单次所可以捕获的最多数量。

示例

输入

3 1 1

1 1

1 2

1 3

输出

2

说明:最多可以同时捕获两名敌人,可以是 (1,1) 和 (1,2) 处的敌人,也可以是 (1,2) 和 (1,3) 处的敌人,但不可以同时捕获三名敌人,因为三名敌人时,纵坐标的最大差值是2,超过了参数B的值 1。

思路

观察到坐标的范围不大,x、y 都是 1000 以内的,可以直接将每个敌人放入坐标系中,再枚举坐标系中的每个 A*B 的矩形,统计矩形内的敌人数量。

求敌人数量时使用二维前缀和优化时间,枚举时直接枚举右上端点即可。

代码

N, A, B = map(int, input().split())
mp = [[0 for j in range(1001)] for i in range(1001)]

# 在地图内计数
for i in range(N):
    x, y = map(int, input().split())
    mp[x][y] += 1  

# 前缀和初始化
for i in range(1, 1001):
    for j in range(1, 1001):
        mp[i][j] += mp[i-1][j] + mp[i][j-1] - mp[i-1][j-1]  

ans = 0
for i in range(A+1, 1001): #枚举右上端点
    for j in range(B+1, 1001):  # 此时枚举的矩形为 (i-A, j-B) 到 (i,j)之间的矩形
        t = mp[i][j] - mp[i-A-1][j] - mp[i][j-B-1] + mp[i-A-1][j-B-1]
        ans = max(ans, t)
print(ans)

彩带

描述

输入描述

第一行两个整数 N,K,以空格分开,分别表示彩带有N厘米长,你截取的一段连续的彩带不能超过K种颜色。

接下来一行 N 个整数,每个整数表示一种色彩,相同的整数表示相同的色彩。

1≤N,K≤5000,彩带上的颜色数字介于[1, 2000]之间。

输出描述

一行,一个整数,表示选取的彩带的最大长度。

示例

输入

8 3

1 2 3 2 1 4 5 1

输出

5

说明:最长的一段彩带是 [1, 2, 3, 2, 1],共 5 厘米。

思路

哈希表+滑动窗口。使用哈希表来统计每个数出现次数;当窗口内的颜色的数量超过K的时候,滑动左指针。

代码

N, K = map(int, input().split())
c = list(map(int, input().split()))

ans = 0
d = {}

left = 0
for right in range(N):
    if c[right] not in d:
        d[c[right]] = 1
    else:
        d[c[right]] += 1
    while left < right and len(d) > K:
        d[c[left]] -= 1
        if d[c[left]] == 0:
            del d[c[left]]
        left += 1
    ans = max(ans, right - left + 1)
print(ans)

回文串

描述

现在小美获得了一个字符串。小美想要使得这个字符串是回文串。

小美找到了你。你可以将字符串中至多两个位置改为任意小写英文字符 'a'-'z'。

你的任务是帮助小美在当前制约下,获得字典序最小的回文字符串。数据保证能在题目限制下形成回文字符串。

注:回文字符串:即一个字符串从前向后和从后向前是完全一致的字符串。例如字符串 abcba, aaaa

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

一个普通数据人的成长之路 文章被收录于专栏

记录实习和校招的笔试面试(标题年份表示笔试或面试的年份)和个人成长,牛友们的点赞、评论、收藏就是更新的动力和支持~

全部评论
感觉这题量,2个小时不够啊
1 回复 分享
发布于 2023-04-01 19:42 天津
总共多少分,多少分笔试能过?
点赞 回复 分享
发布于 2023-04-01 19:54 天津

相关推荐

05-04 21:11
门头沟学院 Java
面试官很和蔼,很尊重我。面试开始时,首先介绍了自己所工作的部门,当时说的太快,我听的不太清。接下来就是项目和八股了:1、你先介绍一下自己在做项目时遇到的难点,以及你是怎么解决的。答的稀烂,没提前准备。直接让面试官问我了,感觉面评会很差!2、那你先说一下怎么基于拦截器进行Token的校验以及刷新,答的越详细越好。3、为什么要用双层拦截器?4、知道ThreadLoacl的底层原理吗?说一下。5、知道死锁吗?解释一下死锁。6、死锁怎么解决呢?答了一次性申请所有资源和申请不到资源就自己释放自己的资源。面试官肯定了第二种,说不同的场景要用不同的解决方法。我甚至让面试官说一种场景,面试官被我干沉默了半分钟,说这不太好说,但还是说了一个场景。7、解释一下通过分布式锁以及stream消息实现高并发一人一单的优化。答的很烂,说了个大概,分布式锁实现一人一单,stream加快执行效率。8、用到了什么分布式锁呢?9、setnx的底层原理是什么?知道吗?10、假如现在有三个线程来下单了,库存只有两个了,那三个线程都判断库存充足,并且都是首次下单,是不是三个线程都能判断自己可以下单成功,这时你将三个线程中的用户id和优惠券id都放到消息队列中,这个时候只能消耗两条消息,还有一条消息怎么办?没回答上来(事实上,库存判断+是否下过单判断+减库存+写入Stream队列全部封装在一个Lua脚本中原子执行,Lua脚本具有原子性,多个线程即使并发执行EVAL命令,Redis仍会串行执行脚本逻辑,保证同一时刻只有一个线程完成判断与写入流程。)11、说一下是怎么使用工厂模式和策略模式实现布隆过滤器解决缓存穿透。12、解释布隆过滤器的底层原理。13、知道MySQL吗,说一下都有哪些索引?14、联合索引知道吗?底层是什么数据结构?15、解释一下B+树。16、联合索引的查询规则最左前缀法则的底层原理。答了JavaGuide上的,通过每个索引筛选掉一部分数据。面试官说,那直接从第二个索引也能进行筛选啊,怎么解释呢?17、说一下事务的隔离级别。18、脏读、不可重复读和幻读。19、场景题:N个数的文件中,怎么搜索到前10大的数字?答的是将数据先存到DB表中,再读取就可以了。面试官说,这效率太慢了,一般不采取。20、知道ReenTrantLock吗?说一下它的底层原理。就回答了个CLH锁,忘记AQS了.......算法题:股票问题Ⅲ,没撕出来,跟着carl刷到动态了,但还没刷到这一题,面试官提醒了我3次,还是不会。反问环节总结:人生中的第一次大厂面试,总时长1小时15分钟。自己准备的不够充分,回答问题逻辑性不够(回答的很多话都需要面试官去理解,然后问我是不是这样),很多知识点的底层原理也不太清楚。虽然结果不好,但是已经尽力了,毕竟从决定学java到现在不过才2个月,还是要多学多思考。
美团一面2246人在聊 查看20道真题和解析
点赞 评论 收藏
分享
评论
4
28
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务