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) 10 for(int j = 0;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){ 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 ){ 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 ){ 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 ){ 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 }