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

https://www.nowcoder.com/test/5583018/summary

这套题目难度不大,主要是考了递归调用、完全背包、栈、字典树

看得出是数据结构的题目多一些,最开始第二个题目,一个完全背包的,没看出来是完全背包,感觉数据量不大,递归可以求吧

结果说数字大一点算不出答案,后来改循环,发现还是很多算不出,然后做别的题目去了,最后才做这个,才发现是个裸的完全背包。

第一题:用骰子来控制走的步数,然后给你一个总的步数,求走法有多少种

思路:递归分解即可

 1 import java.util.*;
 2  
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner cin = new Scanner(System.in);
 6         int x = cin.nextInt();
 7         System.out.println(deal(x));
 8     }
 9     static int deal(int x){
10         if(x==0)
11             return 1;
12         int num = 0;
13         for(int i = 1;i<=6;i++){
14             if(x-i>=0){
15                 num+=deal(x-i);
16             }else
17                 return num;
18         }
19         return num;
20     }
21 }

 

第二题:给你六种纸币(1,5,10,20,50,100),每种纸币有无限多个,求N元钱用这六种纸币组合可以有多少种组合方法

思路:完全背包,把纸币的数量看成是重量,然后N元钱看成背包大小即可

 1 import java.util.*;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner cin = new Scanner(System.in);
 6         int weight[] = {1,5,10,20,50,100};
 7         Long dp[][] = new Long[10][10005];
 8         int n = cin.nextInt();
 9         for(int i = 0;i<dp.length;i++)
10             for(int j = 0;j<dp[i].length;j++)
11                 dp[i][j] = 0L;
12         dp[0][0] = 1L;
13         for(int i = 1;i<=weight.length;i++){
14             for(int j = 0;j<=n;j++){
15                 if(j< weight[i-1])
16                     dp[i][j] = dp[i-1][j];
17                 else
18                     dp[i][j] = dp[i-1][j]+dp[i][j-weight[i-1]];
19             }
20         }
21         System.out.println(dp[weight.length][n]);
22     }
23 }

 

第三题:和POJ这个题目一样http://www.cnblogs.com/Tree-dream/p/5701137.html

 

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

思路:构建字典树进行比较即可

 1 import java.util.*;
 2  
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner cin = new Scanner(System.in);
 6         String str = cin.nextLine();
 7         String p = cin.nextLine();
 8         Node root = new Node();
 9         for(int i = 0;i<str.length();i++){
10             if(root.next[str.charAt(i)]==null){
11                 root.next[str.charAt(i)] = new Node(str.charAt(i));
12                 add(root.next[str.charAt(i)],str.substring(i+1));
13             }else {
14                 add(root.next[str.charAt(i)],str.substring(i+1));
15             }
16         }
17         int max = 0;
18         for(int i = 0;i<p.length();i++){
19             if(root.next[p.charAt(i)]!=null){
20                 int tmp = Find(root,p.substring(i));
21                 if(tmp>max)
22                     max = tmp;
23             }
24         }
25         System.out.println(max);
26     }
27  
28     static int Find(Node root,String x){
29         Node tmp = root;
30         int leng = 0;
31         for(int i = 0;i<x.length();i++){
32             if(tmp.next[x.charAt(i)]!=null){
33                 leng++;
34                 tmp = tmp.next[x.charAt(i)];
35             }else
36                 break;
37         }
38         return leng;
39     }
40  
41     static void add(Node node,String x){
42         Node tmp = node;
43         for(int i = 0;i<x.length();i++){
44             if(tmp.next[x.charAt(i)]==null)
45                 tmp.next[x.charAt(i)] = new Node(x.charAt(i));
46             tmp = tmp.next[x.charAt(i)];
47         }
48     }
49 }
50 class Node{
51     Node next[] = new Node[200];
52     char str;
53     Node(char x){
54         this.str = x;
55         for(int i = 0;i<100;i++)
56             next[i] = null;
57     }
58     Node(){
59  
60     }
61 }

 

posted @ 2018-03-11 20:45  一个_小菜鸟  阅读(1437)  评论(0编辑  收藏  举报