【美团点评】2020校招算法工程师方向笔试题

这套题难啊。。好多坑点。而且想了好久。交卷两小时。。想了一晚上。

第一题还是不知道怎么dp的。。可能要坑一下明天补。。

如果有大佬能指点下我就更好了QAQ。我是真的菜。。



试题链接:2020校招算法工程师方向笔试题

5、 外卖小哥的保温箱

题意:众所周知,美团外卖的口号是:”美团外卖,送啥都快”。身着黄色工作服的骑手作为外卖业务中商家和客户的重要纽带,在工作中,以快速送餐突出业务能力;工作之余,他们会通过玩智力游戏消遣闲暇时光,以反应速度彰显智慧,每位骑手拿出装有货物的保温箱,参赛选手需在最短的时间内用最少的保温箱将货物装好。

我们把问题简单描述一下:

1 每个货物占用空间都一模一样

2 外卖小哥保温箱的最大容量是不一样的,每个保温箱由两个值描述: 保温箱的最大容量 bi ,当前已有货物个数 ai ,(ai<=bi)

3 货物转移的时候,不必一次性全部转移,每转移一件货物需要花费 1秒 的时间

题解:我这个题用贪心只过了30%。。而且我花了一晚上时间想怎么dp。。想不出来。

讨论区大佬说贪心只能得到最优k。QAQ我先坑一下。。明天补吧可能

代码:

6、字符串最长公共前缀

题意:输入n个字符串(1<=n<=3*102,字符串总长度不超过103,只包含小写字母)

后面多次查询,每次查询输入两个数字x,y,输出第x个字符串和第y个字符串的最长公共前缀长度。(查询次数不超过102)

题解:字符串丢进vector.然后输入要比较的两个字符串的索引。(记得有多组数据)

循环在第二个字符串找第一个字符串的当前字符,然后不停截取就可以了。最后输入前缀的长度即可。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 vector<string> v;
 5
 6 int main(){
 7     int n;
 8     cin>>n;
 9     string str;
10     for( int i = 0 ;i < n ;i++){
11         cin>>str;
12         v.push_back(str);
13     }
14     int a,b;
15     while(cin>>a>>b){
16         a--;b--;
17         string ans = v[a];
18         while(v[b].find(ans)){
19             ans = ans.substr(0,ans.size()-1);
20         }
21
22         int cnt = ans.size();
23         cout<<cnt<<endl;
24     }
25
26     return 0;
27 }

7、字符串排序

题意:生活中经常有需要将多个字符串进行排序的需要,比如将美团点评的部分业务名称(外卖、打车、旅游、丽人、美食、结婚、旅游景点、教培、门票、酒店),用拼音表示之后按字母逆序排序。字母逆序指从z到a排序,比如对两个字符串排序时,先比较第一个字母按字母逆序排z在a的前面,当第一个字母一样时再比较第二个字母按字母逆序排,以此类推。特殊情况1)空字符串需排在最前面;2)若一个短字符串是另一个长字符串的前缀则短字符串排在前面。请自行实现代码进行排序,直接调用sort等排序方法将不得分且视为作弊。

题解:这个主要是理解题意。。我刚开始没看题用sort过了30%?,手写了一个快排。

然后没注意里面那个前缀的判断,过了40%。。也就是我们需要重写一个比较。你用函数也可以,重载运算符也可以。

根据它两个条件来就行了。因为是用的升序排列,最后输出要逆序。

再提一点:字符串输入的处理,我是用判断到‘,‘把字符串存储丢进vector.然后再清空字符串继续操作。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1010;
 4
 5 vector<string> v;
 6
 7 bool cmp(string a,string b){
 8     if(a == "")   return true;
 9     if(b.find(a) == 0 && a != b)    return true;
10     if(a.find(b) == 0 && a != b)    return false;
11     if(a > b)   return true;
12
13     return false;
14 }
15
16 void qsort(int left,int right){
17     string res = v[left];
18     if(left >= right)  return;
19     int l = left;
20     int r = right;
21     while(l != r){
22         while(l < r && cmp(res,v[r]) == false){
23             r--;
24         }
25         swap(v[l],v[r]);
26
27         while(l< r && cmp(res,v[l])){
28             l++;
29         }
30         swap(v[l],v[r]);
31     }
32
33     qsort(left,l-1);
34     qsort(l+1,right);
35 }
36
37 int main(){
38     string s;
39     cin>>s;
40     int len = s.size();
41
42     int index = 0;
43     string str;
44     v.clear();
45     while(index <= len){
46         if(s[index] == ‘,‘ || index == len){
47             v.push_back(str);
48             str.clear();
49             index++;
50         }
51         else{
52             str += s[index];
53             index++;
54         }
55     }
56
57
58     qsort(0,v.size()-1);
59     for(int i = v.size()-1;i >0 ;i--){
60         cout<<v[i]<<",";
61     }
62
63
64     cout<<v[0]<<endl;
65
66     return 0;
67 }

8、 工作安排

题意:小美是团队的负责人,需要为团队制定工作的计划,以帮助团队产出最大的价值。

每周团队都会有两项候选的任务,其中一项为简单任务,一项为复杂任务,两项任务都能在一周内完成。第i周,团队完成简单任务的价值为li,完成复杂任务的价值为hi。由于复杂任务本身的技术难度较高,团队如果在第i周选择执行复杂任务的话,需要在i-1周不做任何任务专心准备。如果团队在第i周选择执行简单任务的话,不需要提前做任何准备。

现在小美的团队收到了未来N周的候选任务列表,请帮助小美确定每周的工作安排使得团队的工作价值最大。

题解:哎,上去贪心也是30%。后面发现不是。。是个比较简单的dp。

思考一下两个状态。我们需要用两周的时间做判断。

1、做两周的简单工作。  easy[i-1] + easy[i]

2、准备一周,做一周的难工作。  diff[i]

这一周的状态是由前两周来决定,。

所以可以得到状态转移方程dp[i] = max(dp[i-1] + easy[i],dp[i-2] + diff[i])

初始化的时候记得dp[0]和dp[1]都要初始化掉,

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1010;
 4
 5 int easy[maxn];
 6 int diff[maxn];
 7 int dp[maxn];
 8
 9 int main(){
10     int n;
11     cin>>n;
12     for(int i = 0 ;i < n ;i++){
13         cin>>easy[i]>>diff[i];
14     }
15     dp[0] = max(easy[0],diff[0]);
16     dp[1] = max(dp[0]+easy[1],diff[1]);
17
18     for(int i = 2;i <= n; i++){
19         dp[i] = max(dp[i-1]+easy[i],dp[i-2]+diff[i]);
20     }
21     cout<<dp[n-1]<<endl;
22
23     return 0;
24 }

原文地址:https://www.cnblogs.com/Asumi/p/12543602.html

时间: 2024-10-09 04:39:43

【美团点评】2020校招算法工程师方向笔试题的相关文章

2015年阿里巴巴校招研发工程师在线笔试题汇总

在线笔试题汇总 卷一: 1.下面的函数中哪个是系统调用而不是库函数______? printf scanf fgetc read print_s scan_s 2.某足球队有四名外援,分别来自巴西.荷兰.意大利和美国.他们分别擅长前锋.后卫或守门,其中: ① 美国外援单独擅长守门: ② 意大利外援不擅长前锋: ③ 巴西外援和另外某个外援擅长相同的位置: ④ 荷兰外援擅长的位置和巴西外援不同. 以上条件可以推出巴西外援擅长的位置是______. 前锋 守门 后卫 前锋或守门 后卫或守门 前锋或后卫

算法面试题-今日头条2017客户端工程师实习生笔试题4:或与加

今日头条2017客户端工程师实习生笔试题 题目: 这个题做到最后,时间不是很够,题目内容比较简单,求出第k个正整数符合x+y=x|y,然而这个k的取值范围非常大(k<=2000000000),所以可以不用考虑穷举法,当然,时间不够的话写个穷举试试运气也可以. 穷举法: 1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 2016/9/6. 5 */ 6 7 public class Main { 8 public

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

Java开发工程师上机笔试题

网上看到3道比较好的Java开发工程师上机笔试题,没有答案这里把答案写出来,给大家参考. 1.编一个程序,输入10个整数,并放在数组中,先降序输出所有的数,再统计并输出其中正数.负数和零的个数 package cn.Pigzhu.test; import java.util.Scanner; /**  * 控制台输入10个数字,并输入正负和零的个数  * @author xiaoyezhu  *  */ public class test { public static void main(St

转:嵌入式软件工程师经典笔试题

> 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)  #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3). 意识到这个表达式将使一个1

今日头条2017后端工程师实习生笔试题 - 题解

今日头条2017后端工程师实习生笔试题 最大映射 题意 给n(不超过50)个字符串,每个字符串(长度不超过12)由A-J的大写字符组成.要求将每个字符映射为0-9,使得每个字符串可以看作一个整数(不能有前导零),求这些字符串映射后得到数字的最大和值.(数据保证至少有一个字符不是任何字符串的首字母) 思路 根据字符所在的位置,累积统计每个字符的权值,从右到左权值分别为1, 10, 100, 1000..... 然后排序,从权值最小的到权值最大的依次映射为0-9,求和即为答案. 注意 由于每个字符串

新浪PHP开发工程师面试笔试题

找实习找的心累,于是在学校bbs上找了一个新浪的散招. 先做了一份笔试题,题目如下. 1.列举一下你知道的Unix信号,并说明其用途 2.给你一个ip地址,写出其无符号32位的表示法 3.给你一些http的东西post请求,数据,cookie,URL,写一个http头. 4.简述一些shell命令 top/mv/find/sar/touch/wc/chmod/df/strace 5.用PHP写一个程序,打印出本月日历 6.简单的SQL查询.有一个取手机号的后四位,不会. 取某几位好像可以用SUB

美团点评2017校招笔试真题-算法工程师A

1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. map 正确答案: B STL的容器可以分为以下几个大类: 1. 顺序(序列)容器,有 vector,list,deque , string,stack( 适配器类), queue( 适配器类), priority queues( 适配器类). 2.关联容器,有set, multiset,map,multimap, bitset,hash_set, hash_map, hash_multi

美团点评2017校招研发offer面经

2017届的校招早早就结束了,抽出时间做个记录. 职位:后台开发工程师 岗位职责: 如果你热爱编程,这里给你平台用代码改变世界: 如果你乐于挑战,这里有用户和商家五花八门的需求和苛刻的系统运行环境在等待着你: 在这里,你可以参与后端模块.数据平台.基础服务和云计算功能的开发工作: 在这里,你还将参与需求定义,确定设计方案并负责最终实现: 你需要对代码质量负责,确保代码正确无误,高效工作,无QA,你的代码你做主! 工作要求: 1. 一句话,会写代码.你可以是本科及以上计算机相关专业的科班出身,也可