这两天看了3个有趣的数组。
第一题,编写一个java程序,形成以下形式的二维数组,并输出。
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
昨晚研究了好久,没想出来,看了答案,原来是这样。
分析:
- 数组名[下标1][下标2]
将矩阵看成是一个5行5列的数组,以正对角线划分,除了位置为[0][0]的1,将数组划分为4轮,分别是2-4,5-9,10-16,17-25。
轮数为奇数时,即2-4、10-16,以对角线上的数为基点,例如,第3轮,基点13,坐标[3][3],10-12的数的规律是,下标1自增,下标2不变,如[0][3],[1][3],[2][3]。14-16的数的规律是下标1不变,下标2自减,如[3][2],[3][1],[3][0]。
轮数为偶数时,即5-9、17-25,以对角线上的数为基点,例如,第2轮,基点7,坐标[2][2],8-9的数的规律是,下标1自减,下标2不变,如[1][2],[0][2]。5-6的数的规律是下标1不变,下标2自增,如[2][0],[2][1]。
代码解析:
如上所示,第n轮,都有【下标1/下标2】为n的,除去对角线的坐标均为n-1到0或从0到n-1。zero每次循环都确保初始值为0,当zero==n时,zero自减或自增。
设轮数为n,不变的坐标为change,可变的坐标zero,value记录数值,因为a[0][0]=1,已经设置初始值,所以value=2,外循环从i=1开始执行,执行4次
第1轮,3个数,除对角线的坐标为1+1;第2轮,5个数,为2+2;第3轮,3+3,第4轮,4+4……规律:与轮数的关系:2n+1
当轮数n=3时,j=23+1=7,内循环执行7次,3+3,则有j<n执行的是打印从[0][3],[1][3],[2][3]的值,a[zero++][change]=value++;接着打印对角线的value;最后j>n,a[change][–zero]=value++;
代码:
int m=5;//定义数组长度
int a[][]=new int[m][m];
int n=1,zero=0,change=1,value=2;
a[0][0]=1;
for(int i=1;i<m;i++) {
for(int j=0;j<(2*n+1);j++) {
if(n%2!=0) {
if(j<n) {
a[zero++][change]=value++;
}
if(j==n) {
a[j][j]=value++;
}
if(j>n) {
a[change][--zero]=value++;
}
}else{
if(j<n) {
a[change][zero++]=value++;
}
if(j==n) {
a[j][j]=value++;
}
if(j>n) {
a[--zero][change]=value++;
}
}
}
n++;
change++;
zero=0;
}
for(int i=0;i<m;i++) {
for(int j=0;j<m;j++) {
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
第二题:
还有简单点的,比如将下列数组
1 2 3
4 5 6
7 8 9
变成:
规律:正对角线进行分割,原先的值[0][1]+[1][0]=6,改a[1][0]=6,原先的值[0][2]+[2][0]=10,依次类推(6+8=14),这些相加的坐标互为相反数[0][1]、[1][0],[1][0]=[0][1]+[1][0]即a[j][i]=a[i][j]+a[j][i]。
int[][] a= {{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;i++) {
for(int j=0;j<3;j++) {
if(!(i==j)) {
a[j][i]=a[i][j]+a[j][i];
}
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
第三题:
奇数列顺序输出j坐标从0到4自增,偶数列逆序输出j坐标从4到0自减
int k=0,a[][]=new int[5][5];
for(int i=0;i<5;i++) {
if(i%2==0) {
for(int j=0;j<5;j++) {
a[j][i]=++k;
}
}else {
for(int j=4;j>=0;j--) {
a[j][i]=++k;
}
}
}
for(int i=0;i<5;i++) {
for(int j=0;j<5;j++) {
System.out.print(a[i][j]+"\t");
}
System.out.println();
}