有趣的java二维数组打印问题

这两天看了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=2
3+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();
		}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值