美團點評2017秋招筆試編程題

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

這套題目難度不大,主要是考了遞歸調用、徹底揹包、棧、字典樹java

看得出是數據結構的題目多一些,最開始第二個題目,一個徹底揹包的,沒看出來是徹底揹包,感受數據量不大,遞歸能夠求吧node

結果說數字大一點算不出答案,後來改循環,發現仍是不少算不出,而後作別的題目去了,最後才作這個,才發現是個裸的徹底揹包。數據結構

第一題:用骰子來控制走的步數,而後給你一個總的步數,求走法有多少種this

思路:遞歸分解便可spa

 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元錢用這六種紙幣組合能夠有多少種組合方法code

思路:徹底揹包,把紙幣的數量當作是重量,而後N元錢當作揹包大小便可htm

 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.htmlblog

 

第四題:給出兩個字符串(可能包含空格),找出其中最長的公共連續子串,輸出其長度遞歸

思路:構建字典樹進行比較便可

 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 }
相關文章
相關標籤/搜索