美团后端开发实习笔试

美团后端开发实习笔试

  • 美团后端开发实习笔试
    • 1. 礼物
    • 2. 探索
    • 3. 替换
    • 4. 奶茶
    • 5. 购买游戏
    • 总结

美团后端开发实习笔试

一共五道算法编程题,120min,难度还算ok,简单到中等吧,就是要自己写输入输出什么的有点儿麻烦,第一题看错题了,浪费了将近一个小时…直接导致最后一个题没时间做。还是我太菜。

1. 礼物

小美现在有一个长度为n的数组,数组仅包含正整数,小美可以选择一个数字k,数组中数字大小满足在[k-1,k+1]之间的数字数量就是小美能够获得的礼物总量,小美希望最大化可以获得的礼物总量。

输入描述

第一行一个正整数n,表示数组长度
第二行n个空格分隔的正整数表示数组中的每个正整数
1<=n<=100000,每个数字保证在[1,100]之间

输出描述

一个正整数表述小美最多能获得的礼物数量

样例输入

6
1 2 2 3 5 5

样例输出

4

int main()
{
	int n;
	int max = 0;
	cin>>n;
	vector<int> nums;
	for(int i=0;i<n;i++)
	{
		int a;
		cin>>a;
		nums.push_back(a);
	}
	for(int i=0;i<nums.size();i++)
	{
		int count = 0;
		for(int j=0;j<nums.size();j++)
		{
			if(nums[j]>=nums[i]-1&&nums[j]<=nums[i]+1)
			{
				++count;
				if(count>max)
				{
					max = count;
				}
			}
		}
	}
	cout<<max<<endl;
	return 0;
}

2. 探索

现在你位于(1,1),目标是(n,m),只能向右或向下移动,每次可以在给定区域内移动一个单位,其中小写字母o是已探明区域,小写字母x是未探明区域。要求尽量在已探明区域移动,找出使得未探明区域尽量少的航线,输出这条航线上的未探明区域数量。

输入描述

第一行两个正整数n和m,描述给定区域大小。接下来n行m列字符描述给定区域探明情况。其中保证(1,1)和(n,m)是已探明区域。
1<=n,m<=200

输出描述

一个正整数表示航线最少经历几个未探明区域

样例输入

5 5
oxxxx
xxoox
oooxo
xxxxo
ooooo

样例输出

2

char tmap[200][200];

int searchh(int i,int j,int res)
{
	if(i== 1&&j==1)
	{
		return res;
	}
	if(i==1)
	{
		if(tmap[i][j+1]=='o')
		{
			return searchh(i,j+1,res);
		}
		if(tmap[i][j+1]=='x')
		{
			return searchh(i,j+1,res+1);
		}
	}
	if(j==1)
	{
		if(tmap[i+1][j]=='o')
		{
			return searchh(i+1,j,res);
		}
		if(tmap[i+1][j]=='x')
		{
			return searchh(i+1,j,res+1);
		}
	}
	if(tmap[i+1][j]=='o'&&tmap[i][j+1]=='x')
	{
		return searchh(i+1,j,res);
	}
	if(tmap[i+1][j]=='x'&&tmap[i][j+1]=='o')
	{
		return searchh(i,j+1,res);
	}
	if(tmap[i+1][j]=='o'&&tmap[i][j+1]=='o')
	{
		return searchh(i+1,j,res)>searchh(i,j+1,res)?searchh(i,j+1,res):searchh(i+1,j,res);
	}
	if(tmap[i+1][j]=='x'&&tmap[i][j+1]=='x')
	{
		return searchh(i+1,j,res+1)>searchh(i,j+1,res+1)?searchh(i,j+1,res+1):searchh(i+1,j,res+1);
	}
}

int main()
{
	int m,n;
	cin>>m>>n;
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			cin>>tmap[i][j];
		}
	}
	cout<<searchh(0,0,0);
	return 0;
}

3. 替换

现在给你n个字符,每个字符只能是+或-的一种,可以替换掉不超过k个字符,将+变成-或者将-变成+,使得连续的+最多,求此时最长的连续+的数量

输入描述

第一行两个正整数n和k,表示字符串长度为n,可以替换的字符数量不超过k个。
第二行是一个长度为n的字符串,其中仅有+或-
1<=n,k<=10000

输出描述

一个正整数表示替换不超过k个字符的情况下可以获得的最长连续+的数量

样例输入

10 2
–+±-++±

样例输出

7

int main()
{
	int m,n;
	string s;
	int max=0;
	cin>>s;
	cin>>m>>n;
	for(int i=0;i<m;i++)
	{
		int count = 0,k=n;
		for(int j=i;j<m;j++)
		{
			if(s[j]=='+')
			{
				++count;
			}
			else if(s[j]=='-')
			{
				if(k>0)
				{
					--k;
					++count;
				}
				else
				{
					break;
				}
			}
		}
		max = max > count ? max : count;
	}
	cout<<max<<endl;
	return 0;
}

4. 奶茶

小美在经营一家奶茶店,奶茶店每天会有大量的销售额,这会影响接下来的备货策略,完成小美在查询时的结果

输入描述

第一行两个正整数n和q,n表示奶茶品牌数量,q表示操作命令数量。
第二行n个空格隔开的正整数,表示每个奶茶品牌的单价利润。
接下来q个操作,每个操作均为下列中的一种:
Add x y:品牌x的奶茶增加销量y。
Query BestSales:查询当前操作为止销量最多的品牌,不唯一则输出编号最小的
Query BestProfit:查询当前操作为止利润最多的品牌,不唯一则输出编号最小的
1<=n<=100000,1<=q<=500

输出描述

对每个查询返回正确结果

样例输入

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

样例输出

1
2
1

struct mt
{
	int brand;
	int count;
	int profit;
};

bool cmp1(mt n1,mt n2)
{
	if(n1.count!=n2.count)
	{
		return n1.count>n2.count;
	}
	else
	{
		return n1.brand<n2.brand;
	}
}

bool cmp2(mt n1,mt n2)
{
	int r1 = n1.count*n1.profit;
	int r2 = n2.count*n2.profit;
	if(r1!=r2)
	{
		return r1>r2;
	}
	else
	{
		return n1.brand<n2.brand;
	}
}

int main()
{
	int n,q;
	cin>>n>>q;
	vector<mt> tea;
	for(int i=0;i<n;i++)
	{
		mt a;
		a.brand = i+1;
		a.count = 0;
		cin>>a.profit;
		tea.push_back(a);
	}

	for(int i=0;i<=q;i++)
	{
		string s;
		string s1 = "Query BestSales";
		string s2 = "Query BestProfit";
		getline(cin,s);
		if(s==s1)
		{
			sort(tea.begin(),tea.end(),cmp1);
			mt *temp = &tea[0];
			cout<<temp->brand<<endl;
		}
		else if(s==s2)
		{
			sort(tea.begin(),tea.end(),cmp2);
			mt *tmp = &tea[0];
			cout<<tmp->brand<<endl;
		}
		else if(s.find("Add")!=string::npos)
		{
			int pos = s.find(" ");
			string num = s.substr(pos+1);
			int tpos = num.find(" ");
			string as = num.substr(0,tpos);
			string bs = num.substr(tpos+1);
			int a = atoi(as.c_str());
			int b = atoi(bs.c_str());
			for(int i=0;i<tea.size();i++)
			{
				mt *tp = &tea[i];
				if(tp->brand == a)
				{
					tp->count += b;
				}
			}
		}
	}
	return 0;
} 

5. 购买游戏

现在有n个游戏参与活动,编号为1…n,小美和小团要从n个游戏中进行挑选,由于他们可以一起玩耍,所以每个游戏至多买一份就可以。但小美和小团对每个游戏的喜爱有所不同,他们希望最终购买的游戏中,至少有x个是小美喜欢的,且至少有x个是小团喜欢的。现给出每个游戏的售价以及二人所喜爱的游戏,请问至少需要花费多少钱才能满足上述需求。

输入描述

第一行两个正整数n和x,表示有n个游戏以及题目中描述的x
第二行n个正整数,表示第i个游戏的售价ci
第三行一个正整数a表示小美喜欢的游戏个数
第四行a个正整数表示小美喜欢的游戏编号
第五行一个正整数b表示小团喜欢的游戏个数
第六行b个正整数表示小团喜欢的游戏编号
1<=x<=n<=100000,1<=ci<=1000

输出描述

输出一个数,如果可以满足上述需求,输出最小花费,否则输出-1。

样例输入

5 2
1 1 2 1 2
3
1 3 2
3
1 2 4

样例输出

2

struct game{
	int id;
	int price;
};

bool cmp1(game g1,game g2)
{
	if(g1.price!=g2.price)
	{
		return g1.price<g2.price;
	}
	else
	{
		return g1.id<g2.id;
	}
}

int main()
{
	int ans = 0;
	int n,x;
	cin>>n>>x;
	vector<game> g;
	for(int i=0;i<n;i++)
	{
		game tmp;
		tmp.id = i+1;
		int tmprice;
		cin>>tmprice;
		tmp.price = tmprice;
		g.push_back(tmp);
	}
	
	int a;
	cin>>a;
	vector<game> mei;
	vector<game> tuan;
	for(int i=0;i<a;i++)
	{
		int tmp;
		cin>>tmp;
		game meitmp;
		meitmp.id = tmp;
		for(int j=0;j<g.size();j++)
		{
			game *tp = &g[j];
			if(tp->id==tmp)
			{
				meitmp.price = tp->price;
			}
		}
		mei.push_back(meitmp);
	}
	int b;
	cin>>b;
	for(int i=0;i<b;i++)
	{
		int tmp;
		cin>>tmp;
		game tuantmp;
		tuantmp.id = tmp;
		for(int j=0;j<g.size();j++)
		{
			game *tp = &g[j];
			if(tp->id==tmp)
			{
				tuantmp.price = tp->price;
			}
		}
		tuan.push_back(tuantmp);
	}
	sort(mei.begin(),mei.end(),cmp1);
	sort(tuan.begin(),tuan.end(),cmp1);
	
	vector<int> pos_rec;
	for(int i=0;i<mei.size();i++)
	{
		game *mtmp = &mei[i];
		game *ttmp = &tuan[i];
		if(mtmp->id==ttmp->id)
		{
			ans += mtmp->price;
			x--;
			pos_rec.push_back(i);
		}
	}

	int t = pos_rec.size();
	int pos = pos_rec[t];
	while(x!=0)
	{
		game *mtmp = &mei[pos];
		game *ttmp = &tuan[pos];
		ans+=mtmp->price;
		ans+=ttmp->price;
		x--;
		pos++;
	}
	cout<<ans<<endl;
	return 0;
}

总结

前段时间开始刷LeetCode,一直没有注意对输入输出的处理,这次笔试主要是对输入输出处理不当,字符串处理还需加强,不要再看错题了啊!!!

加油!

你可能感兴趣的:(笔试记录,c++)