在一次技术面试中我被问到这个问题,但是花了一些时间却无法解决。下面的图案代表沿x和y轴的值-
Id,Name
1,one
所以从上面如果
11
7 12
4 8 13
2 5 9 14
1 3 6 10 15
以此类推...
那么该生成点的方法应该怎么实现
(0.0)--->1
(1,0)--->3
(1,1)--->5
(2,2)--->13
应该给1,等于0; 0; 3,代表1,0等,如上所示。感谢您的任何帮助。
答案 0 :(得分:1)
如果仔细观察,数字将按以下顺序增加
(0, 0) -> (0, 1) -> (1, 0) -> (0, 2) -> (1, 1) -> (2, 0) -> (0, 3) -> (1, 2) -> (2, 1) -> (3, 0) -> ...
沿对角线的数字线性增加。这些数字具有相同的曼哈顿距离(x+y)
。在一个这样的对角线上,距离随着x的增加而增加。因此,我们只需要计算对角线下面有多少个点,然后添加x+1
(+1
,因为它在x=0
处增加)。用曼哈顿距离d
计算对角线以下的点很容易,因为其正好
1 + 2 + 3 + ... + d = d *(d+1)/2
。
例如,要计算(3, 1)
,请按照以下步骤操作:
d = 3 + 1 = 4
对角线4 = 4*5/2 = 10
下的点
值(4, 2) = 10 + 3 + 1 = 14
代码:
int getPoint(int x, int y) {
int d = x + y;
return d * (d + 1) / 2 + x + 1;
}