一、题目
这是华为面试的一道题,描述如下:
设 1
的坐标是(0,0)
,x
方向向右为正,y
方向向下为正,例如,7
的坐标为(-1,-1)
,2
的坐标为(1,0)
。编程实现输入任意一点坐标(x,y)
,输出所对应的数字!
二、解决
1、数学归纳推导
思路:
从上图可以发现两大规律:
- 1)螺旋规律
- 2)奇数平方规律:即每一圈的最大值是 ( 2 ∗ c + 1 ) 2 , c 为 圈 数 (2*c+1)^2, c为圈数 (2∗c+1)2,c为圈数。
先说结论:
接下来推导一下:
首先c = max {|x|, |y|}
,再看具体的值,49到46,中间步长为1,差值恰好是半径c(c=3)
的大小,49和40差值恰好是3c
的大小,49到34恰好是5c
,49到28恰好是7c
。
然后可以根据x与y的正负值转换为c的大小,再将上下移动的步数转换为另外一个坐标的正负。
m a x = ( 2 c + 1 ) 2 max = (2c+1)^2