回形取数

本文介绍了一种算法,用于从左上角开始逆时针方向遍历并输出二维数组的所有元素,避免重复输出。文章详细解释了解题思路,包括通过观察规律、使用循环结构和条件判断来实现算法的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

测试系统输入行n,列m,和二维数组,从arr[0][0]开始逆时针输出元素,输出过的元素就不再输出

输入输出

解题思路:

1,用写死的数据去实现样例的输入,看能否发现规律
2,当写到输出第二个left的时候可以感受到如果二维数组的行和列如果再增大,还会有次外圈的存在,同样的也是要输出left,down,right,top
3,猜想从最外圈,次外圈,次次外圈数量(定义变量count)的增长是否会和每次输出 left,down,right,top 有关系;可以通过第2个left去发现这个关系,在left循环输出中的初始值终止值输出元素的获取其实都能够和 count 联系起来,也能够通过观察图形去找这个联系,用count表达式替换了写死数据的left输出去验证联系的正确性
4,当n,m增大时,times相应的也会增大,考虑用while循环去取全部的数,打印一圈(left,down,right,top)后 times = time + 1
5,既然使用while那么什么时候去终止循环呢?
         方法一:使用sum变量记录输出元素的次数,当 次数==二维数组中所有元素个数 的时候就表示已经全部输出了,跳出循环;注意是跳出2重循环(还有更优雅的跳出2重循环的方式)

代码:

1,通过写死数据的形式输出样例

public void testArray() {
	int [][] arr = {
			{1,2,3},
			{4,5,6},
			{7,8,9}};
	//left
	for (int i = 0; i < arr.length; i++) {
		System.out.print(arr[i][0] + " ");
	}
	//down
	int [] down = arr[arr.length -1];
	for (int i = 1; i < down.length; i++) {
		System.out.print(down[i] + " ");
	}
	//right 倒序输出数组
	for (int i = arr.length -2; i >= 0 ; i--) {
		System.out.print(arr[i][2] + " ");
	}
	//top 
	int [] top = arr[0];
	for (int i = top.length -2; i >= 1; i--) {
		System.out.print(top[i] + " ");
	}
	//left2 
	for (int i = 1; i < arr.length -1; i++) {
		System.out.print(arr[i][1] + " ");
	}
}

2,将打印语句中写死的数据用count进行替换

public void test2() {
	int[] arr[] = { 
			{ 1, 2, 3 }, 
			{ 4, 5, 6 }, 
			{ 7, 8, 9 } };
	int total = 12; //数组中元素总数量
	int sum = 0; //记录输出的总数量
	int count = 0; //记录循环到第几圈了
	while (true) {
		// left
		for (int i = count; i < arr.length - count; i++) {
			System.out.print(arr[i][count] + " ");
			sum ++;
			if (sum == total) {
				break;
			}
		}
		if (sum == total) {
			break;
		}
		// down
		int[] arrDown = arr[arr.length - (count + 1)];
		for (int i = (count + 1); i < arrDown.length -count ; i++) {
			System.out.print(arrDown[i] + " ");
			sum ++;
			if (sum == total) {
				break;
			}
		}
		if (sum == total) {
			break;
		}
		// right
		for (int i = arr.length - (count + 2); i >= count; i--) {
			System.out.print(arr[i][arr[i].length - (count + 1)] + " ");
			sum ++;
			if (sum == total) {
				break;
			}
		}
		if (sum == total) {
			break;
		}
		// top
		int [] arrTop = arr[count];
		for (int i = arrTop.length - (count + 2); i > count; i--) {
			System.out.print(arrTop[i] + " ");
			sum ++;
			if (sum == total) {
				break;
			}
		}
		if (sum == total) {
			break;
		}
		count ++;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值