美团点评2017年秋招笔试编程题

【题目一】大富翁游戏

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

【输入】一个整数n,(1<=n<=6)

【输出】输出一个整数,表示投骰子的方法。

【示例】输入6,输出32.


【思路】

n=1时,num = 1  (2的0次幂)

n=2时,num = 2  即可以从n=1多走一步,或者直接n=2 (2的1次幂)

n=3时,num = 4  可以从n=1多2,或者n=2多1,或者n=3,为1+2+1 = 4种 (2的2次幂)

同理 num[n]  = num[1]+num[2]+……+num[n-1]+1 = 2的n-1次幂。


import java.util.Scanner;

public class bigWealth {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		
		System.out.println(methodsNum(n));
	}
	
	public static int methodsNum(int n)
	{
		if(n>6 || n<=0)
			return -1;
		else 
			return (int)Math.pow(2, n-1);
	}

}


【题目二】拼凑钱币

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

【输入】一个整数n(1 ≤ n ≤ 10000)
【输出】一个整数,表示不同的组合方案数

import java.util.Scanner;

public class Main {
	
	public static void main(String args[]){
        Scanner input=new Scanner(System.in);
        while(input.hasNext())
        {
        	int n=input.nextInt();
        	long res=count(n);
        	System.out.println(res);
        }
    }

	public static long count(int n){
		
	    int coins[]={1,5,10,20,50,100};
	    int len=coins.length;
	    //dp[i][j]的含义是使用coins[0……i]货币情况下,组成钱数j的方法数。
	    long dp[][]=new long[len][n+1];
	    
	    //使用任意种货币组成0元的情况都有1种。
	    for(int i=0;i<len;i++)
	    	dp[i][0] = 1;
	    
	    //钱数为第一种货币的倍数时,均有一种仅使用第一种货币就拼凑出钱数的方法。
	    for(int j=1;coins[0]*j<=n;j++)
	    	dp[0][coins[0]*j]=1;
	    
	    for(int i=1;i<len;i++){
	        for(int j=1;j<=n;j++)
	        {
	            for(int k=0;k*coins[i]<=j;k++)
	            	
	            	dp[i][j]+=dp[i-1][j-k*coins[i]];
	        }
	    }
	    return dp[len-1][n];
    }
    
}


【题目三】最大矩形面积

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

【示例】

【输入】: 6

            2 1 5 6 2 3

【输出】:10


暴力法…


import java.util.Scanner;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		
		int []array = new int[n];
		for(int i=0;i<n;i++)
			array[i] = input.nextInt();
		System.out.println(getMaxArea(array));

	}
	
	public static int getMaxArea(int []array)
	{
		int len = array.length;
		int maxArea  = 0;
		
		for(int i=0;i<len;i++)
		{
			int width = 1;            //记录此时宽度为1
			int height = array[i];    //记录此时高度为array[i]
			int area = height*width;  //记录初始面积
			int max = area;
			for(int j=i+1;j<len;j++)
			{
				width++;
				height = Math.min(height, array[j]);
				area = height*width;
				max = max>=area?max:area;
			}
			
			maxArea = maxArea>max?maxArea:max;
		}
		
	    return maxArea;

	}

}

【题目四】最长公共连续子串

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

【示例】

【输入】

abcde

abgde

【输出】

2

import java.util.Scanner;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		String str1 = input.nextLine();
		String str2 = input.nextLine();
		
		System.out.println(getLongestSameStr(str1,str2));
	}
	
	public static int getLongestSameStr(String str1,String str2)
	{
		int max = 0;
		if(str1.length()==0 || str2.length()==0)
		{
			return 0;
		}
		else
		{
			//生成动态规划表,dp[i][j]表示把str1[i]和str2[j]当做公共子串的最后一个字符的情况下,公共子串的长度。
			int [][]dp = new int[str1.length()][str2.length()];
			//str1的任意位字符等于str2的第一位字符,那么dp[i][0]相应位置置1。
			for(int i=0;i<str1.length();i++)
				if(str1.charAt(i) == str2.charAt(0))
					dp[i][0] = 1;
			
			//str2的任意位字符等于str1的第一位字符,那么dp[0][j]相应位置置1。
			for(int j=1;j<str2.length();j++)
				if(str2.charAt(j) == str1.charAt(0))
					dp[0][j] = 1;
			
			//str1的任意位字符等于str2的任意位字符,那么dp[i][j] = dp[i-1][j-1] + 1。
			for(int i=1;i<str1.length();i++)
				for(int j=1;j<str2.length();j++)
					if(str1.charAt(i) == str2.charAt(j))
						dp[i][j] = dp[i-1][j-1] + 1;
			
			
			for(int i=0;i<str1.length();i++)
				for(int j=0;j<str2.length();j++)
					max = max>dp[i][j]?max:dp[i][j];
					
			return max;
		}
	}

}

DP大法好啊…要努力补课了~

keep moving……


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值