[美团笔试08.13] 5道题全题解分享
美团笔试08.13题解分享:
[1] 会魔法的外卖员:
需要对时间排序,不排序的无法AC!
外卖员派送的时间点只能是派送时间的整数倍,只有大于派送时间点的外卖才能正常配送,其余使用魔法。
//
// Created by Harold on 2022/8/13/0013.
//
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
private:
int n_nums;
int t_time;
vector<int> timeList;
public:
void getInput(){
cin>>n_nums>>t_time;
vector<int> timeInput(n_nums);
for(int i = 0; i < n_nums; i++){
cin>>timeInput[i];
}
timeList = timeInput;
}
void getTheAns(){
int useMagic = 0;
int currenTime = 0;
int currentTimeCount = 1;
sort(timeList.begin(),timeList.end());
for(int i = 0; i < n_nums; i++){
currenTime = currentTimeCount * t_time;
if(currenTime <= timeList[i]){
currentTimeCount++;
}
else{
useMagic++;
}
}
cout<<useMagic;
}
void run(){
getInput();
getTheAns();
}
};
int main(){
Solution s;
s.run();
return 0;
} [2] 扫地机器人: //
// Created by Harold on 2022/8/13/0013.
//
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution{
private:
int n;
int m;
int k;
int needFlashNum;
string cmd;
vector<vector<int>> theMap;
public:
void getInput()
{
cin>>n>>m>>k;
cin>>cmd;
vector<vector<int>> mapInput(n,vector<int>(m,0));
mapInput[0][0] = 1;
needFlashNum = n * m - 1;
theMap = mapInput;
}
void run(){
getInput();
// showInput();
getTheAns();
}
void showInput(){
cout<<"n = "<<n<<", m = "<<m<<", k = "<<k<<endl;
cout<<"cmd = "<<cmd<<endl;
cout<<"map size = "<<theMap.size()<<endl;
}
void getTheAns(){
int currentRow = 0;
int currentCol = 0;
for(int i = 0; i < k; i++){
switch (cmd[i]) {
case 'W':{
if(currentRow-1 >= 0){
currentRow--;
if(theMap[currentRow][currentCol] == 0){
needFlashNum--;
theMap[currentRow][currentCol] = 1;
}
}
break;
}
case 'A':{
if(currentCol-1 >= 0){
currentCol--;
if(theMap[currentRow][currentCol] == 0){
needFlashNum--;
theMap[currentRow][currentCol] = 1;
}
}
break;
}
case 'S':{
if(currentRow+1 < n){
currentRow++;
if(theMap[currentRow][currentCol] == 0){
needFlashNum--;
theMap[currentRow][currentCol] = 1;
}
}
break;
}
case 'D':{
if(currentCol+1 < m){
currentCol++;
if(theMap[currentRow][currentCol] == 0){
needFlashNum--;
theMap[currentRow][currentCol] = 1;
}
}
break;
}
default:{
break;
}
}
if(needFlashNum == 0){
cout<<"Yes"<<endl;
cout<<i+1<<endl;
return;
}
}
if(needFlashNum > 0){
cout<<"No"<<endl;
cout<<needFlashNum;
}
}
};
int main(){
Solution s;
s.run();
return 0;
}
[3] 玩扑克牌 先用牌的索引模拟洗牌翻牌的过程,最后根据索引从输入中对应取出。
//
// Created by Harold on 2022/8/13/0013.
//
#include<iostream>
#include <deque>
#include <vector>
using namespace std;
class Solution{
private:
int n_nums;
vector<int> inputNumList;
public:
void getInput(){
cin>>n_nums;
vector<int> inputList(n_nums);
for(int i = 0; i < n_nums; i++){
cin>>inputList[i];
}
inputNumList = inputList;
}
void getTheAns(){
deque<int> simulationQueue;
deque<int> positionQueue;
vector<int> res(n_nums,0);
for(int i = 0; i < n_nums; i++){
simulationQueue.push_back(i);
}
while(!simulationQueue.empty()){
simulationQueue.push_back(simulationQueue.front());
simulationQueue.pop_front();
simulationQueue.push_back(simulationQueue.front());
simulationQueue.pop_front();
positionQueue.push_back(simulationQueue.front());
simulationQueue.pop_front();
}
for(int i = 0; i < n_nums; i++){
res[positionQueue[i]] = inputNumList[i];
}
cout<<res[0];
for(int i = 1; i < n_nums; i++){
cout<<" "<<res[i];
}
}
void run(){
getInput();
getTheAns();
}
};
int main(){
Solution s;
s.run();
return 0;
} [4] 三元组 暴力法求解
//
// Created by Harold on 2022/8/13/0013.
//
#include <iostream>
#include <vector>
using namespace std;
class Solution{
private:
int n_nums;
vector<int> numList;
public:
void getInput(){
cin>>n_nums;
vector<int> numInput(n_nums);
for(int i = 0; i < n_nums; i++){
cin>>numInput[i];
}
numList = numInput;
}
void run(){
getInput();
getTheAns();
}
void getTheAns(){
int diff_ij,diff_jk;
int res = 0;
for(int i = 0; i < n_nums; i++){
for(int j = i+1; j < n_nums; j++){
diff_ij = numList[i] - numList[j];
for(int k = j+1; k < n_nums; k++){
diff_jk = 2 * numList[j] - numList[k];
if(diff_ij == diff_jk){
res++;
}
}
}
}
cout<<res;
}
};
int main(){
Solution s;
s.run();
}
[5] 二叉树上摘金币 使用数组表示二叉树,深度优先进行搜索。
//
// Created by Harold on 2022/8/13/0013.
//
#include <iostream>
#include <vector>
using namespace std;
class Solution{
private:
int n_nums;
vector<int> moneyList;
int maxMoney = 0;
public:
void getTheAns(){
dfs(1,0);
cout<<maxMoney;
}
void dfs(int currentIndex, int moneyObtain){
if(currentIndex > n_nums){
return;
}
moneyObtain += moneyList[currentIndex];
if(moneyObtain > maxMoney){
maxMoney = moneyObtain;
}
dfs(2*currentIndex,moneyObtain);
dfs(2*currentIndex+1,moneyObtain);
}
void getInput(){
cin>>n_nums;
vector<int> moneyInput(n_nums+1);
for(int i = 1; i <= n_nums; i++){
cin>>moneyInput[i];
}
moneyList = moneyInput;
}
void run(){
getInput();
getTheAns();
}
};
int main()
{
Solution s;
s.run();
return 0;
}
查看7道真题和解析