猿輔導 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