选用教材:《Java核心技术卷一》
第三章 Java的基本程序设计结构
3.10.8 不规则数组
书上的习题有一道是从n个数里面抽取k个数,计算你的中奖概率。
一般情况下,如果从n个数字中抽取k个数,就会有:
n×(n-1)×(n-2)×(n-3)×......×(n-k+1)/1×2×3×......×k种可能性。
因为k总是不大于n,所以把这些所有的可能性放在数组里,它会是一个三角形数组,如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1、按照常规的套公式解法,如下:
package array; public class IrregularArray { public static void main(String[] args) { final int NMAX = 10; int [] [] odds = new int[NMAX+1][]; //创建一个二维数组 for (int n=0;n<=NMAX;n++) { odds[n]=new int[n+1]; //搭建三角形框架 } for(int n=0;n<odds.length;n++) { for(int k=0;k<odds[n].length;k++) { int lotterOdds=1; for(int i=1;i<=k;i++) { lotterOdds = lotterOdds*(n-i+1)/i; odds[n][k]=lotterOdds; //把数据一个个放进数组 } } } for(int[] row:odds) { for(int odd:row) System.out.printf("%4d",odd); //遍历输出数组所有元素 System.out.println(); } } }
得到的结果为:
0 0 1 0 2 1 0 3 3 1 0 4 6 4 1 0 5 10 10 5 1 0 6 15 20 15 6 1 0 7 21 35 35 21 7 1 0 8 28 56 70 56 28 8 1 0 9 36 84 126 126 84 36 9 1 0 10 45 120 210 252 210 120 45 10 1
2、还有一种比较取巧、不套公式的解题方法:
观察题目事先给出的三角形数组,可以得知这些数组元素满足一个规律:
当行下标(i)和列下标(j)都大于0时,numbers[i][j] =numbers[i-1][j-1] +numbers[i-1][j]. //假设numbers[][]是题中的三角形数组
所以代码也可以这么写:
package array; public class IrregularArray { public static void main(String[] args) { final int ROWS = 7; final int COLUMS = 7; int [][] trianglearrays = new int [ROWS][COLUMS]; //创建一个大小已定的二维数组 for (int r=0;r<ROWS;r++) { trianglearrays[r][0] = 1; //将第一行的元素装入数组 } for (int c=0;c<COLUMS;c++) { trianglearrays[c][c] = 1; //将行列下标相等的元素装入数组 } for(int c1=1;c1<trianglearrays[0].length;c1++) { for (int r1=1;r1<trianglearrays.length;r1++) { if(c1!=r1) { trianglearrays[r1][c1]=trianglearrays[r1-1][c1-1]+trianglearrays[r1-1][c1]; //套数学规律装入其他元素 } } } for (int [] row:trianglearrays) { for (int b:row) System.out.printf("%4d ",b); //遍历输出数组元素 System.out.println(); } } }
得到的结果为:
1 0 0 0 0 0 0
1 1 0 0 0 0 0
1 2 1 0 0 0 0
1 3 3 1 0 0 0
1 4 6 4 1 0 0
1 5 10 10 5 1 0
1 6 15 20 15 6 1
3、忽略系统自动在空位填入的0的话,两种编程方式都是可取的。第一种方式里,实现搭建一个三角形框架的做法确实很新颖。这也说明:写代码并不只是做数学规律题,还要结合编码工具、数据结构特点等,来力求代码展现出最好的效果。