美团2017秋招笔试编程题

1.大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步。求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法。

这一题可以用归纳法:

n=1,有1种可能,即f(1)=1

n=2,有2种可能,即f(2)=2

n=3,有4种可能,即f(3)=4

归纳一波:f(n) = f(n-1)+f(n-2)+f(n-3)+....+f(1)+1,f(1)=1,f(2)=2.则f(n)=2^(n-1).

​#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
    int n;
    int ans;
    scanf("%d",&n);
    ans = pow(2,n-1);
    printf("%d",ans);
    return 0;
}

所以答案可以直接设置为2^(n-1),可以轻松算出答案。


2.给你六种面额 1、5、10、20、50、100 元的纸币,假设每种币值的数量都足够多,编写程序求组成N元(N为0~10000的非负整数)的不同组合的个数。

#include<iostream>
using namespace std;

int main()
{
    int coin[6] = { 1,5,10,20,50,100 };
	int N; cin >> N;//输入N元
	int* dp = new int[N+1]();//可以让数组0到N
	dp[0] = 1;
	for (int i = 0; i < 6; i++)//使用交易后计算,使用1,2,3,4,5,6面值的数量
	{
		for (int r = coin[i]; r <= N; r++)
		{
			dp[r] = dp[r] + dp[r - coin[i]];
		}
	}
	cout << dp[N];
	return 0;
}

3.给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。

 

我的思路时算出每一个柱子作为基础,来算其可延申的矩形的面积,存入multiset容器中最后输出最大的值,时间复杂度会大一些。

#include<iostream>
#include<vector>
#include<set>
using namespace std;
//就算可以延申x方向的长度
int Length(vector<int>v,int i)
{
	int len = 1;
	int a = i -1 ;int  b = i + 1;
	while (a>=0&&v[a] >= v[i])//向左延申的长度
	{
			a--;
			len++;
	}
	while (b <= v.size()-1  && v[b] >= v[i])//向右延申的长度
	{
			b++; len++;
	}
	return len;
}
int main()
{
	
	int num; cin >> num;
	vector<int> v;
	for (int i = 0; i < num; i++)
	{
		int p; cin >> p;
		v.push_back(p);
	}
	multiset<int>s;
	for (int i = 0; i < num; i++)
	{
		int ret = v[i] * Length(v, i);//当前面积
		s.insert(ret);//存入当前面积到set容器中
	}
	cout << *s.rbegin();
	return 0;
}

4给出两个字符串(可能包含空格),找出其中最长的公共连续子串,输出其长度。

最直接的思路可以设置两个字符串string a,b;第一个a可以算出所有的字串,在b中查询,并记录最大长度。

#include<iostream>
#include<algorithm>
using namespace std;
 
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    int Max=0;
    if(a.empty()||b.empty()) cout<<0<<endl;
    for(int i=0;i<a.size();i++)
    {
        for(int j=i;j<a.size();j++)
        {
            string c=a.substr(i,j-i+1);
            if(b.find(c)!=-1)
            {
                int temp=c.length();
                Max=max(Max,temp);
            }
        }
    }
    cout<<Max<<endl;
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值