猿辅导 2019 校招技术笔试题总结
1.猿辅导公司某研发小组一共有 12 名同学,其中 9 人能做后端开发,6 人能做前端开发。现在要抽调 4 名同学成立项目小组,负责公司的一项“机密”项目。其中 2 名同学做后端开发,2 名同学做前端开发。有多少种选派方法?
解答:
2.猿辅导公司某部门月会上,有 5 名同学在依次领取入职周年的礼物,一束鲜花。HR 共准备有 5 种不同颜色的鲜花供他们挑选。则有且仅有两名同学挑选了相同颜色的鲜花的概率是多少?
解答:共有5*5*5*5*5=3125种情况,再算有且只有两个人选同一种颜色的情况, 1.选出两个人C52=10; 2.选同一种颜色有5种情况; 3.其他3个人从剩下4种颜色选:4*3*2=24. 共有10*5*24=1200 概率为1200/3125=48/125.
3.某天猿辅导 HR 组织大家去漂流,早上,参加团建的同学都到齐了,并且按到达公司的先后顺序排好队了。 由于员工太多,一个大巴车坐不下,需要分多个车,车是足够的,但所有人需要按一定顺序上车,按如下规则安排上车的顺序:
假设大巴车容量为 m,从队首开始,每 m 个人分成一个小组,每个小组坐一辆车。同时只有一个车打开车门供员工上车。 小组之间按从队尾到队首顺序依次上车,同一小组内先到的同学先上,求所有人上车的顺序。
例如: 员工数 8, 车容量 3, 员工到达顺序为 1 2 3 4 5 6 7 8, 3个人一个小组,分三个小组, 小组一: 1, 2, 3, 小组二: 4, 5, 6,小组三: 7,8。 小组上车顺序为: 小组三,小组二,小组一 。 所有员工上车顺序为 7 8 4 5 6 1 2 3
方案1:将原输入分为几个小组,然后依次输出,使用vector<vector<int>> 来保存。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int mCount, cCount;
cin >> mCount;
cin >> cCount;
vector<int> member;
for (int i = 0; i<mCount; i++){
int t;
cin >> t;
member.push_back(t);
}
vector<vector<int>> result;
int length= mCount/cCaption; //大巴的数量
if(mCount % cCaption){
length++;
}
for (int i = 0; i<length; i++){
int j;
vector<int> tmp; //为局部变量
for (j = 0; j<cCount; j++){
if (i*cCount + j < mCount){
tmp.push_back(member[i*cCount + j]);
}
}
result.push_back(tmp);
}
for (int i = result.size()-1; i >= 0; i--){
for (int j = 0; j<result[i].size(); j++){
cout << result[i][j] << " ";
}
}
return 0;
}
方案2:
比如 员工到达顺序为 1 2 3 4 5 6 7 8,车容量为3个人,所以是3组,现在数组存的就是 int[] ps={1 2 3 4 5 6 7 8};
分为三组的情况下:
第一组123第二组456第三组78
所以只需将每一组中的设置两个标识位begin和end,
然后将begin和end值互换即可
比如第一组123,开始时begin=0,end=2,然后将ps[0]和ps[2]互换
然后再将begin++,end--。
互换的次数就有每一组的数量来决定=每一组的数量/2
最终每一组互换之后就会得到3 2 1 6 5 4 8 7,只需再倒序输出即可
#include <iostream>
#include <vector>
using namespace std;
int main(){
int mCount,cCaption;
cin>>mCount;
cin>>cCaption;
vector<int> member;
for(int i=0;i<mCount;i++){
int tmp;
cin>>tmp;
member.push_back(tmp);
}
int cCount = mCount/cCaption;
if(mCount % cCaption){
cCount++;
}
for(int i=0;i<cCount;i++){
int begin = i*cCaption;
int end = begin + cCaption -1;
if(end >= mCount){
end = mCount-1;
}
while(begin < end){
int tmp = member[begin];
member[begin] = member[end];
member[end] = tmp;
begin++;
end--;
}
}
for(int i=mCount-1;i>=0;i--){
cout<<member[i]<<" ";
}
cout<<endl;
return 0;
}
4.拍照队形
猿辅导公司的 N位(N>=4)研发同学组织了一次秋游活动,某同学带了个无人机在高空拍照,活动结束时,先拍了一张所有同学排成公司猴头Logo的照片, 接着有人提议再排成“猿”的首字母Y字形来拍一张合照。
用字符串中的每一个字符(不是换行符或结束符'\0')代表一位老师,输出排好后的队形。要求 Y字除去中心点外,上下半部分等高,按照从左到右,从上到下进行排序。队形中没人的部分用空格占位。
输入数据保证可以排出一个完整的Y字,即长度为 3k+1 (k>=1)
例如: 7个 x ,排成队形为(为了方便说明,这里用‘-’代替空格):
x---x
-x-x
--x
--x
--x
方案:
k的值就是标志Y的两个部分的分界线,我们要做的就是分两个部分进行打印,上半部分(行数=k)和下半部分(行数=k+1).
首先看上半部分:
上半部分的输出其实就是首先是每一行的第一个x前面输出a个空格,再输出x,然后中间去输出b个空格,再输出x;关键就是我们去确定a和b;大家可以看上面的找出规律,每一行每一行的第一个x前面输出a个空格a=i(i为当前每行的行数,从0开始);中间去输出b个空格,这个b=2*(k-i)-1(i为当前每行的行数,从0开始);之后再输出a个空格。
下半部分直接就是打印每一行的第一个i前面输出a个空格,这个a=k
#include <iostream>
#include <string>
using namespace std;
void printN(int num){
for(int i=0;i<num;i++){
cout<<" ";
}
}
int main(){
int N;
cin>>N;
getchar(); //清空缓冲区的回车
string str;
getline(cin,str);
int k = (N-1)/3;
int top = k;
int below = k+1;
int index = 0;
for(int i=0;i<top;i++){
printN(i);
cout<<str[index++];
printN(2*(k-i) - 1);
cout<<str[index++];
printN(i);
cout<<endl;
}
for(int i=0;i<below;i++){
printN(k);
cout<<str[index++]<<endl;
}
return 0;
}
参考链接:
https://www.nowcoder.com/questionTerminal/1b1f87ef6e7d40529d82c96aef79e8a4
https://www.nowcoder.com/test/question/done?tid=26316130&qid=309673#summary