方阵的一层循环输出

简单记录一个二维数组顺时针旋转后的输出结果

  • 方阵:行和列数都相同的二维数阵。

将方阵通过一层循环输出

let ary = [ 
	[1, 2, 3, 4],[5, 6, 7, 8],
	[9, 10, 11, 12],[13, 14, 15, 16]
	];
let rank = ary.length;
for (let i = 0;i < rank*rank; i++){
	// 注意js中除法结果需要强制转换为整数
	console.log(ary[parseInt(i/rank)][i%rank]+'\n')
}
  • 一个方阵顺时针旋转的过程如下
旋转前
1  2   3   4
5  6   7   8        
9  10  11  12
13 14  15  16
旋转后
13  9   5  1
14  10  6  2
15  11  7  3
16  12  8  4
  • 分析
    经过观察可以看出顺时针旋转的过程数组的第一行成为了数组最后一列,第二行成了数组倒数第二列,依次类推。我们因此需要将数组的每一行转换为数组的倒数第几列就行。
我为什么会首先提出通过一层循环输出二维方阵在这里发挥了作用,
也就是说我们找到了表示数组每一行的具体算法ary[i/rank][i%rank]  
其中i/rank 表示行号,i%rank表示列号。那么我们还需要找到表示
数组每列的算法就可以解决问题了。我们需要借助一个一维数组类实现
y = [0,0,0,0...] 这里需要找到y数组的倒数第几列的表示算法。
[(i%rank)*rank+(rank-i/rank-1)]。这个表达式相当于把每一行变成了倒数第几列。

代码实现

let ary = [ 
	[1, 2, 3, 4],[5, 6, 7, 8],
	[9, 10, 11, 12],[13, 14, 15, 16]
	];
let rank = ary.length;
function rotate(ary,rank){
	let y = Array(rank*rank).fill();
	for(let i = 0; i < rank*rank; i++){
		y[(i%rank)*rank+(rank-parseInt(i/rank)-1)] = ary[parseInt(i/rank)][i%rank];
	}
	// 重新覆盖
	for(let i = 0; i <rank*rank; i++){
		ary[parseInt(i/rank)][i%rank] = y[i];
	}
	return ary;
}
ary = rotate(ary,rank);
console.log(ary)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值