这道题是从朋友的面试经历中得知的,当时闲着没事就花点时间解决了,后来换了一个角度来看问题,又发现了另一个解法。很好!这个应该写在小本本上记下来。
常规思路
如果我们先在数组中找到1的位置,那么就可以按照题意在数组记录所有数字,最后输出遍历输出这个数组就行了。
通过观察发现:图中两个箭头就是计算一个方形数组的周期,从2开始的两个箭头就完成了2 X 2的数组计算,从5开始的两个箭头完成了3 X 3的数组计算,并且每个周期有两个拐弯的点。
由上面的分析,这里我们需要一个变量d来记录当前方向,以及一个变量l记录当前数组的行列长度。另外我们还需要计算出这两个拐弯的点,这里我们用ll表示上一数组的行列长度,这两个拐点分别是ll X ll + 1和 ll X ll + l。
接下来就可以写代码了,按照上面的分析来就能轻松搞定。
1 |
|
问题升级
虽然上面解决了这个问题,但是我们相当于遍历了两次数组,可不可以一次遍历完成输出呢?
遍历输出的顺序是从左往右,从上到下。从图中可以看出每行输出的时候,只要列值保持在对角线(以1为中心)的上下夹角范围(包括对角线上),在当前行满足递增或递减的规律;而列值保持在对角线的左右夹角范围(不包括对角线上),在当前列满足递增或递减的规律。
这个思路判断条件很多,注意去除掉冗余判断。
1 |
|
提示:评论是disqus,需要使用请翻墙!