正则表达式 有的时候,恰当地使用正则,可以让我们的工作事半功倍!
如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码。
注意:只填写缺少代码,不要写任何多余内容,例如,已有的双引号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class A { public static int f (String s) { return s.split("\\p{Punct}" ).length; } public static void main (String[] args) { System.out.println(f("12+35*5-2*18/9-3" )); System.out.println(f("354*12+3-14/7*6" )); } }
调和级数 1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。
但是,它发散的很慢: 前1项和达到 1.0 前4项和才超过 2.0 前83项的和才超过 5.0
那么,请你计算一下,要加多少项,才能使得和达到或超过 15.0 呢?
请填写这个整数。 1835421
暴力 1 2 3 4 5 6 7 8 9 10 11 12 public class Main { public static void main (String[] args) { double sum = 0 ; for (int i = 1 ; i < Integer.MAX_VALUE; i++) { sum += 1.0 / i; if (sum >= 15.0 ) { System.out.println(i); break ; } } } }
近似值 如果x的x次幂结果为10,你能计算出x的近似值吗?
显然,这个值是介于2和3之间的一个数字。
请把x的值计算到小数后6位(四舍五入),并填写这个小数值。 2.506184
注意:只填写一个小数,不要写任何多余的符号或说明。
二分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class Main { public static void main (String[] args) { double start = 2.0 , end = 3.0 ; while (true ) { double middle = (start + end) / 2 ; double result = Math.pow(middle, middle); if (result == 10.0 ) { System.out.println(middle); break ; } else if (result > 10.0 ) { end = middle; } else { start = middle; } } } }
勾股定理 勾股定理,西方称为毕达哥拉斯定理,它所对应的三角形现在称为:直角三角形。
已知直角三角形的斜边是某个整数,并且要求另外两条边也必须是整数。
求满足这个条件的不同直角三角形的个数。
数据格式: 输入一个整数 n (0<n<10000000) 表示直角三角形斜边的长度。 要求输出一个整数,表示满足条件的直角三角形个数。
样例输入1: 5 输出: 1
样例输入2: 100 输出: 2
样例输入3: 3 输出: 0
资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 1000ms
暴力 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import java.util.Scanner;public class Main { public static void main (String[] args) { Scanner scanner = new Scanner (System.in); int n = scanner.nextInt(); int solution = 0 ; for (int i = 1 ; i < n; i++) { int b = (int ) Math.sqrt(n * n - i * i); if (b != 0 && i * i + b * b == n * n) { solution++; } } System.out.println(solution / 2 ); } }
数独 如图,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。
数独的答案都是唯一的,所以,多个解也称为无解。
本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。
本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。
格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。 输出9行,每行9个数字表示数独的解。
样例输入1(即图中题目): 005300000 800000020 070010500 400005300 010070006 003200080 060500009 004000030 000009700
输出: 145327698 839654127 672918543 496185372 218473956 753296481 367542819 984761235 521839764
样例输入2: 800000000 003600000 070090200 050007000 000045700 000100030 001000068 008500010 090000400
输出: 812753649 943682175 675491283 154237896 369845721 287169534 521974368 438526917 796318452
资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 2000ms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 import java.util.Scanner;public class Main { static Scanner scanner = new Scanner (System.in); static int [][] map = new int [9 ][9 ]; public static void main (String[] args) { for (int i = 0 ; i < 9 ; i++) { String buf = scanner.next(); char [] num = buf.toCharArray(); for (int j = 0 ; j < 9 ; j++) { map[i][j] = num[j] - 48 ; } } backTrack(0 , 0 ); } static void backTrack (int x, int y) { if (x == 9 && y == 0 ) { for (int i = 0 ; i < 9 ; i++) { for (int j = 0 ; j < 9 ; j++) { System.out.print(map[i][j] + " " ); } System.out.println(); } System.exit(0 ); } else { if (map[x][y] == 0 ) { for (int i = 1 ; i <= 9 ; i++) { map[x][y] = i; if (!isRowCollision(x, y) && !isColumnCollision(x, y) && !is3x3Collision(x, y)) { backTrack(x + (y + 1 ) / 9 , (y + 1 ) % 9 ); } map[x][y] = 0 ; } } else { backTrack(x + (y + 1 ) / 9 , (y + 1 ) % 9 ); } } } static boolean isRowCollision (int x, int y) { for (int i = 0 ; i < 9 ; i++) { if (map[x][y] == map[x][i] && y != i) { return true ; } } return false ; } static boolean isColumnCollision (int x, int y) { for (int i = 0 ; i < 9 ; i++) { if (map[x][y] == map[i][y] && x != i) { return true ; } } return false ; } static boolean is3x3Collision (int x, int y) { int start, end; if (x < 3 ) { start = 0 ; } else if (x < 6 ) { start = 3 ; } else { start = 6 ; } if (y < 3 ) { end = 0 ; } else if (y < 6 ) { end = 3 ; } else { end = 6 ; } for (int i = start; i < start + 3 ; i++) { for (int j = end; j < end + 3 ; j++) { if (map[i][j] == map[x][y] && i != x && j != y) { return true ; } } } return false ; } }
敢死队 G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。 现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死队队员的独立性,要求如果一名士兵在敢死队中,他的直接上级不能在敢死队中。
请问,G将军有多少种派出敢死队的方法。注意,G将军也可以作为一个士兵进入敢死队。
输入格式: 输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。 接下来n-1个数,分别表示编号为2, 3, …, n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。
输出格式: 输出一个整数,表示派出敢死队的方案数。由于数目可能很大,你只需要输出这个数除10007的余数即可。
样例输入1: 3 1 1 输出: 4
样例说明: 这四种方式分别是:
选1; 选2; 选3; 选2, 3。 样例输入2: 7 1 1 2 2 3 3 输出: 40
数据规模与约定: 对于20%的数据,n ≤ 20; 对于40%的数据,n ≤ 100; 对于100%的数据,1 ≤ n ≤ 100000。
资源约定: 峰值内存消耗(含虚拟机) < 256M CPU消耗 < 2000ms
分析: 树形动态规划
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import java.io.BufferedInputStream;import java.util.Scanner;import java.util.LinkedList;import java.util.List;public class Main { static class Node { List<Integer> subordinate = new LinkedList <>(); int [] dp = { 1 , 1 }; } static Scanner scanner = new Scanner (new BufferedInputStream (System.in)); static int n = scanner.nextInt(); static Node[] node = new Node [n + 1 ]; public static void main (String[] args) { for (int i = 1 ; i <= n; i++) { node[i] = new Node (); } for (int i = 2 ; i <= n; i++) { int m = scanner.nextInt(); node[m].subordinate.add(i); } for (int i = n; i > 0 ; i--) { for (int j = 0 ; j < node[i].subordinate.size(); j++) { int sub = node[i].subordinate.get(j); node[i].dp[1 ] *= (node[sub].dp[0 ]) % 10007 ; node[i].dp[0 ] *= (node[sub].dp[0 ] + node[sub].dp[1 ]) % 10007 ; } } int count = (node[1 ].dp[0 ] + node[1 ].dp[1 ] - 1 ) % 10007 ; System.out.println(count); } }