前端在线编程笔试记录——蛇形数字


题目大意:

有蛇形数组,规律如下:

1 2 3

8 9 4

7 6 5

亦如:

1    2    3    4  5

16 17 18 19 6

15 24 25 20 7

14 23 22 21 8

13 12 11 10 9

就是说,转着圈写正方形数字,像蛇盘旋一样。

要求实现:依次打印出每排的数字。如前,需要打印 1 2 3 8 9 4 7 6 5.


我的思路:

我估计一般人还是会从用二维数组来考虑吧,比如说我。

比如输入3,,就应该对应一个3*3的二维数组:[[1,2,3],[8,9,4],[7,6,5]],这样的话一次打印就很好输出了。

关键是,如何知道二维数组的那一项对应哪个数字呢?arr[0][0]对应1,任意arr[i][j]对应哪一个呢?

我是按着它的这个蛇形规律去思考的。数字是逐步递增的,从1到n*n。先从左上角开始,然后向右赋值,再向下,再向左,再向上,完成一个轮回。里面的赋值一样也是这个顺序,我将每一圈赋值看作一个周期,如果传入4,我需要赋值2圈,如果传入5,我需要赋值3圈(虽然最后一圈仅仅赋值一个数字,也可当作一个轮回)。如图:



功能实现:

function main(n){
	//给每一个轮回去赋值,赋值到二维数组
	//定义二维数组
	var arr = [];
	for(var i=0;i<n;i++){
		arr[i] = [];
	}
	//定义值x,每次递增1
	var x=1;
	var r = Math.ceil(n/2);	//需要循环的次数
	for(var d=0;d<r;d++){
		test(n-d);	//给二维数组的每一个位置赋值
	}

	function test(m){
		//m为从边长递减至循环结束的值,如当n=5时,m可取值5,4,3
		for(var i=n-m,j=n-m;j<m;j++){ arr[i][j] = x++; }	//上边赋值
		for(var i=n-m+1,j=m-1;i<m;i++){ arr[i][j] = x++; }	//右边
		for(var i=m-1,j=m-2;j>=n-m;j--){ arr[i][j] = x++; }	//下边
		for(var i=m-2,j=n-m;i>n-m;i--){ arr[i][j] = x++; }	//左边
	}

	//打印最后结果
	for(var i=0;i<arr.length;i++){
		for(var j=0;j<arr[i].length;j++){
			//console.log(arr[i][j]);
		}
	console.log(arr[i]);	//为了方便查看,直接打出每个数组
	}
}




================================================================

许祥记于2016校园秋招




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值