美团2022年机试

7 篇文章 1 订阅

评价

总体而言,比其他公司的难度低,选择题只有3题,都是机器学习,而且有一题,关于半监督就是从课本上拿下来的。

编程题的4道总体难度不高,最后一题查找不知道怎么办,AC了72%,其他都通过了。

编程题

题目1

n个数,找出[k-1,k+1]范围内数字数量最多的区间内包含的数字个数。

输入n,第二行输入n个数,每个数范围是1-100。

示例

6
1 2 2 3 5 5
输出

4

代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int main(){
	int n;
	cin >> n;
	//vector<int> arr;
	map<int, int> counts;
int minVal = 100, maxVal = 0;
	for(int i = 0; i < n; i++){
		int value;
		cin >> value;
		counts[value]++;
		if(value > maxVal) maxVal = value;
		if(value < minVal) minVal = value;
	}
	int res = 0;// minVal = arr[0], maxVal = arr[n - 1]
	for(int cur = minVal; cur < maxVal; cur++){
		int tempcount = counts[cur-1] + counts[cur] + counts[cur+1];
		res = max(tempcount, res);
	}
	cout << res;
} 

题目2

从(0,0)到(n,m),尽量走'o'的路,只能向下和向右移动,计算最少需要经过几个'x'。本质是《剑指offer》13相似。

示例

5 5
oxxxx
xxoox
oooxo
xxxxo
ooooo
输出

2

代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
int main(){
	int m,n;
	cin >> n >> m;
	vector<vector<int>> weight(n, vector<int>(m, 0));
	char c;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m;j++){
			cin >> c;
			if(c == 'x') weight[i][j] = 1; 
		}
	}
	vector<vector<int>> sum(n, vector<int>(m, 50000));
	sum[0][0] = 0;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m;j++){
			if(i > 0) sum[i][j] = min(sum[i][j], sum[i-1][j] + weight[i-1][j]);
			if(j > 0) sum[i][j] = min(sum[i][j], sum[i][j-1] + weight[i][j-1]);
		}
	}
	cout << sum[n-1][m-1]; 

}

题目3

本质是替换字母使连续字符长度最大leetcode 424,相似的题目在其他公司也有出现。

示例

10 2

--++--+++-
输出

7

代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
int main(){
	int n,k;
	cin >> n >> k;
	string str;
	cin >> str;
	int i = 0, ans = 0;
	while(i <= n-k){
		int x = k, j = i + 1;
		while(j < n){
			if(str[i] != str[j]){
				if(x == 0) break;
				x--;
			}
			j++;
		}
		ans = min(n, max(ans, j-i+x));
		i++;
		while(i<n && str[i-1]==str[i]) i++;
	}
	cout << ans;
}

题目4

第一行两个正整数n和q,n表示奶茶的品牌数量,q表示操作数量。第二行n个空格隔开的正整数,表示每个奶茶品牌的单价利润。接下来q个操作,每个操作为下列的一种:Add x y :品牌x的奶茶增加销量y。Query BestSales :查询当前操作为止销量最多的奶茶品牌,若不唯一输出编号最小的。Query BestProfit :查询当前操作为止利润最多的奶茶品牌,若不唯一输出编号最小的。1 <= n <= 100000, 1 <= q <= 500保证品牌x的范围在[1, n]之内,保证销量y增加值在[1, 100]之内销量和利润的答案保证在 [1, 1e9] 的范围内

示例

2 6
1 2
Add 1 3
Add 2 2
Query BestSales
Query BestProfit
Add 1 1
Query BestProfit
输出

1

2

1

代码

AC 72%

#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
int main(){
	int n, q;
	cin >> n >> q;
	vector<int> profit(n);
	for(int i = 0;i < n;i++)
		cin >> profit[i];//输出品牌号需要加1
	vector<int> totalSale(n), totalPro(n);
	for(int i = 0; i < q; i++){
		string query;
		cin >> query;
		if(query[0] == 'A'){
			int brand, num;
			cin >> brand >> num;//需要-1 
			totalSale[brand - 1] += num;
			totalPro[brand-1] += num * profit[brand-1];
		}
		else{
			cin >> query;
			if(query=="BestSales"){
				int resSale = 0, resbrand = -1;
				for(int i = 0;i <n;i++){
					if(resSale< totalSale[i]){
						resSale = totalSale[i];
						resbrand = i;
					}
					
				}
				cout<<resbrand + 1 << '\n';
			}
			else{
				int resPro = 0, resbrand = -1;
				for(int i = 0;i <n;i++){
					if(resPro< totalPro[i]){
						resPro = totalPro[i];
						resbrand = i;
					}
					
				}
				cout<<resbrand + 1 << '\n';
			}
		}
	} 
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值