美团2024年秋招第一场笔试【前端&移动端】 2024/12/12
1.在一个长度为28的数组中删除第5个元素时(元素序号:1~28),需要向前移动(23)个元素。
2.如下图一个树型结构,其结点E在树的中序遍历中的位次为(5)
3.存在中缀表达式:(2*(3-4))*5,通过下面的代码将其转换为后缀表达式,则当扫描到字符4时,栈ops中所存元素为。 (*(-
解析
4.计数排序算法是一种简单的排序算法,这种排序算法对一个待排序的表进行排序,并将结果存放在另一个表中,表中所有关键字各不相同,计数排序算法针对表中每个元素,通过扫描待排序的表一趟,统计出表中有多少个元素的关键字比该元素的关键字小,从而进行排序。在关键字序列{8,13,27,14,15,21}中,若采用计数排序,则得到的计数依次为(0,1,5,2,3,4)。
5.对于下列关键字序列,不可能构成某二叉排序树中一条查找路径的序列是? A
A.90,17,83,24,85,71
B.90,18,89,32,86,33
C.19,87,75,27,34,36
D.10,23,69,66,31,32
6.在TCP/IP四层模型中,TCP和UDP是传输层中两个非常重要的协议,下列选项中,关于这两种协议的区别描述错误的是(C)
A.TCP提供的是面向连接的、可靠的端到端通信机制
B.为了确保数据的可靠传输,TCP采用了确认和重发机制
C.允许丢包的前提下,TCP相比UDP传输效率更高
D.UDP相对数据传送可靠性要求没有TCP那么严格
7.有A、B和C三个作业同时到达,执行时间分别为4,3,6,且在系统中以单道方式运行,则可以获得最短的平均周转时间的执行顺序为(B,A,C)。
解析
由于三个作业同时到达,故在以单道方式运行的系统中,想要获得最短的平均周转时间,用SJF(短作业优先)调度算法的效果比较好
8.下列哪一个进程-资源图会产生死锁()
上图先分配资源,得到
R1=R2=R3=0,死锁
先分配资源,得到
R1=0,R2=1,R3=0
然后去掉所有从方框出发的箭头,图化简为
P1->R2, P2->R1, P3->R3
然后先满足P1->R2,P1结束,资源变成
R1=1, R2=1, R3=0
再满足P2->R1,P2结束,资源变成
R1=1, R2=2, R3=1
再满足P3->R3,P3结束,资源变成
R1=2, R2=3, R3=1
9.下列关于TCP和UDP说法错误的是(A)
A.UDP是面向字节流的协议
B.TCP的头部消息较UDP来说更全面
C.TCP是端对端的不支持广播、多播
D.TCP可以用在远程登陆方面,UDP可以用在语音通话方面
10.VLAN(Virtual Local Area Network,虚拟局域网),能够限制广播域,提高网络安全性。VLAN ID有效范围是1-4094,则下列选项中,哪个VLAN ID范围属于为FDDI和令牌环网使用的VLAN ID(1002-1005)
解析
VLAN ID:VLAN TAG包的VLAN ID号,有效范围是1-4094,0和4095都为协议保留值,VLAN ID 0 表示不属于任何VLAN,但携带802.1Q的优先级标签,所以一般被称为Priority-only frame,其一般作为系统使用,用户不可使用和删除。1为系统默认VLAN,即Native VLAN,2-1001是普通的VLAN,1006-1024保留仅系统使用,用户不能查看和使用,1002-1005是支持fddi和令牌环的VLAN,1025-4095是扩展的VLAN
11.某主机的 IP 地址为 212.212.77.55,子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是?212.212.79.255
解析
由子网掩码可知前 22 位为子网号、后 10 位为主机号。IP 地址的第 3 个字节为 010011 01 ,后面2位是主机号,将主机号全置为 1,可得广播地址为 212.212.79.255
12.下面关于 InnoDB 存储引擎和 MyISAM 存储引擎正确的是(A)
A.InnoDB 支持行级锁和表级锁,而 MyISAM 支持表级锁
B.InnoDB 支持全文索引,而 MyISAM 不支持全文索引
C.InnoDB 不支持事务,而 MyISAM 支持事务
D.InnoDB 不支持外键,而 MyISAM 支持外键
13.在MySQL中可以用来执行预处理语句的是(EXECUTE)
解析
PREPARE语句准备好一条SQL语句,并分配给这条SQL语句一个名字供之后调用。准备好的SQL语句通过EXECUTE命令执行,通过DEALLOCATE PREPARE命令释放掉。
14.以下哪种设计模式可以动态地给对象增加扩展功能,为扩展功能提供了子类化的灵活替代方案(装饰器模式)
15.下面代码使用了哪种设计模式(抽象工厂模式)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
16.模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。下列说法不正确的是(C)
A.模板方法模式能提高系统的复用性,符合开闭原则
B.servlet中的Httprequest的doGet和doPost方法使用了模板方法模式
C.模板方法模式不会增加类的数目
D.模板方法模式的一个缺点是,如果父类添加新的抽象方法,所有子类都要改一遍
解析
模板方法模式的优缺点是:优点:1、提高复用性,2、提高扩展性,3、符合开闭原则
缺点:1、类数目增加,2、增加了系统实现的复杂度,3、继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
17.中间代码的主要优点是(提供了一种平台无关的中间表示)
18.在寄存器分配中常采用图染色法,以下不是其目的是(优化程序的逻辑结构)
19.假设有一个简单的正则表达式 [a-zA-Z_][a-zA-Z0-9_]* 用于匹配标识符。给定字符串 "abc123", 词法分析器会识别为多少个标识符(1)
解析
识别结果为a bc123
20.<input>标签的(D )属性规定必需在提交表单之前填写输入字段
A.multiple
B.pattern
C.placeholder
D.required
解析
A选项, multiple 属性适用于以下类型的 <input> 标签:email 和 file,multiple 属性规定 <input> 元素中可选择多个值。
B选项,pattern 属性描述了一个正则表达式用于验证 <input> 元素的值。
C选项,placeholder 属性提供一种提示,在用户输入值前会显示在输入域上。
D选项,required 属性规定必须在提交之前填写输入域。D选项正确
21.在background: #eee url(1.png) no-repeat 0 0 / contain;中,属性值“0 0”表示的属性是(C)
A.background-clip
B.background-size
C.background-position
D.background-origin
解析
在background组合属性中,能使用“/”的属性只有background-position和background-size,且background-position在前,background-size在后,也就是,属性值“0 0”表示的属性为background-position,属性值“contain“表示的属性是background-size
22.执行以下代码,为了清除浮动,下列做法可行且属于 BFC 应用的是(C)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
A.在 box2 盒子后面添加加代码:<div style="clear: both;"></div>
B.在 box1 盒子后面添加加代码:<div style="clear: both;"></div>
C.在 box1 盒子中设置属性:overflow: hidden
D.在 box2 盒子中设置属性:overflow: hidden
解析
本题考察HTML元素和css属性。A选项可以清除浮动,但属于额外标签法,并不涉及BFC,不符合题意;C选项,在box1盒子设置overflow: hidden可以触发BFC,具备BFC属性的元素,可以包裹住内部的浮动子元素,从而达到清除浮动元素的作用,符合题意
23.下列选项不属于<meta>标签的http-equiv的取值的是(D)
A.content-type
B.default-style
C.refresh
D.keywords
解析
A选项,content-type规定文档的字符编码。
B选项,default-style规定要使用的预定义的样式表。
C选项,refresh定义文档自动刷新的时间间隔。
D选项,http-equiv没有keywords这个取值。
24.下列代码的输出结果是?a b d c
1 2 3 4 5 6 |
|
解析
JS 是单线程执行的,为了防止某段代码执行过久,产生阻塞,引入了异步。既然有异步就肯定有同步,在 JS 中同步任务进入主线程后立即执行,当主线程的任务执行完毕后,即主线程处于空闲状态时,才会读取事件队列中的任务,代码中 setTimeout 属于异步任务,其它属于同步任务立即执行
25.下列方式无法实现跨域通信的是?D
A.JSONP
B.WebSocket
C.CORS
D.Ajax
解析
A、B、C 均可实现跨域通信,除此之外还有 Hash 和 H5 新增的 postMessage() 可以实现跨域通信,Ajax 无法实现跨域通信。
26.请问以下 JS 代码最终输出的结果是(true、true)
1 2 3 4 5 |
|
解析
instanceof操作符用于检查一个对象是否属于某个特定的class,实例对象son由函数func1实例化得出,son instanceof func1自然是返回true,选项CD错误。
尽管实例对象son并非由函数func2实例化得到的,但是instanceof并不关心构造实例的函数,而是关心与原型链匹配的prototype,且son.__proto__ === func2.prototype,因此son instanceof func2将返回true
27.下列程序的输出结果是? 2 undefined 2
1 2 3 4 5 6 7 8 |
|
解析
考察 ES6 中的箭头函数,若箭头函数代码块部分没有大括号,默认返回表达式的结果,所以第一个输出应该为 2。若有大括号但是没有 return 语句,则没有任何返回值,所以第二个输出应为 undefined。若箭头函数代码块有大括号且有 return 语句,则返回结果,所以第三个输出为 2
28.'\\\\\\'.replace(new RegExp('\\\\\\\\', 'gi'), '/') 的执行结果是? /\
解析
由于转义字符的原因,\\表示为一个\,RegExp('\\\\\\\\', 'gi')为一个正则匹配,含义如下
-
\\\\\\\\
\\\\\\\\
结果是在模式中是四个反斜杠,这将匹配文本中的两个反斜杠。\\\\
代表两个反斜杠。\\
在字符串中代表一个反斜杠。
-
标志:
'gi'
g
- 全局匹配;找到所有匹配项,而不是在第一次匹配后停止。i
- 不区分大小写的匹配。
这个正则表达式的功能:
- 它在文本中搜索任何两个反斜杠 (
\\
) 的出现。 - 它会全局搜索整个字符串,忽略大小写(虽然反斜杠本身没有大小写之分)。
29.请问以下 JS 代码最终输出的结果是({go: ƒ}、window、window)
1 2 3 4 5 6 7 8 9 |
|
解析
(obj.go)()中的括号没有改变执行的顺序,点符号总是先执行,因此它可以认为是常规的调用对象方法,this指向对象obj下的go函数,选项D错误。
(method = obj.go)()其实可以拆成两步,第一步是对变量method赋值,第二步是在全局环境下单独调用method方法,因此this的指向是window,选项A错误。
同理,(obj.go || obj.stop)()因为表达式存在||,导致属性访问器转换为一个不包含允许设置this信息的普通值,也就是丢失了指向go函数的this值,因此this的指向也是window
30.编程题1-小美的密码
小美准备登录美团,需要输入密码,小美忘记了密码,只记得密码可能是 𝑛n 个字符串中的一个。小美会按照密码的长度从小到大依次尝试每个字符串,对于相同长度的字符串,小美随机尝试,并且相同的密码只会尝试一次。小美想知道,她最少需要尝试多少次才能登录成功,最多需要尝试多少次才能登录成功。
小美不会重新尝试已经尝试过的字符串。成功登录后会立即停止尝试。
输入描述
第一行输入一个整数 n (1≤n≤1000)代表密码字符串的个数。
第二行输入一个只由小写字母组成的字符串 (1≤∣s∣≤1000) 代表正确的密码。
接下来 n 行,每行输入一个长度不超过 1000 的字符串,代表小美记得的密码。
思路
不难,按照题意模拟即可
#include <bits/stdc++.h>
using namespace std;
int n,ans;
string s,temp;
int cnt[1005]; //记录每个长度的不相同字符串个数
map<string,int> mp;
int main() {
cin>>n>>s;
for(int i=0;i<n;i++){
cin>>temp;
//检查长度
if(mp[temp]) continue;
mp[temp]++;
cnt[temp.size()]++;
}
// for(int i=1;i<=s.size();i++)
// cout<<cnt[i]<<" ";
for(int i=1;i<s.size();i++){
ans+=cnt[i];
}
ans++;
cout<<ans<<" "<<ans+cnt[s.size()]-1;
return 0;
}
31.编程题2-小美的数组删除
小美有一个长度为 n 的数组 a1,a2,…,an ,他可以对数组进行如下操作:
● 删除第一个元素 a1,同时数组的长度减一,花费为 x。
● 删除整个数组,花费为 k×MEX(a) (其中 MEX(a)表示 a 中未出现过的最小非负整数。例如 [0,1,2,4]的 MEX为3 )。
小美想知道将 a 数组全部清空的最小代价是多少,请你帮帮他吧。
输入描述
每个测试文件均包含多组测试数据。第一行输入一个整数 T (1≤T≤1000) 代表数据组数,每组测试数据描述如下:
第一行输入三个正整数 n,k,x (1≤n≤2×10^5, 1≤k,x≤10^9)代表数组中的元素数量、删除整个数组的花费系数、删除单个元素的花费。
第二行输入 n 个整数 a1,a2,…,an (0≤ai≤n),表示数组元素。
除此之外,保证所有的 n 之和不超过 2×10^5。
思路
根据数据规模,遍历一次删除头部的花费情况,需要注意下更新MEX的方法。
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int T,n,k,x,a[N];
int main() {
cin>>T;
while(T--){
cin>>n>>k>>x;
map<int,int> mp; //存储当前数组中每个数字对应的数量
long long ans; //存储最优的花费
int maxv; //当前数组中最小的未出现数
for(int i=0;i<n;i++){
cin>>a[i];
mp[a[i]]++;
}
//初始化
for(int i=0;i<=n;i++){ //这里最小出现的元素肯定是<=n的
//找到没单个删除前当前最小未出现过的元素
if(!mp[i]) {
maxv=i;
break;
}
}
ans=maxv*k;
long long temp=0;
//开始遍历每种情况
for(int i=0;i<n;i++){
//删除掉后的情况
temp=(i+1)*x;
mp[a[i]]--;
//再次寻找maxv
if(!mp[a[i]]){
maxv=min(maxv,a[i]);
}
ans=min(ans,temp+maxv*k);
}
cout<<ans<<endl;
}
return 0;
}