向谁编写函数以生成坐标

时间:2019-05-12 04:25:05

标签: algorithm

在一次技术面试中我被问到这个问题,但是花了一些时间却无法解决。下面的图案代表沿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等,如上所示。感谢您的任何帮助。

1 个答案:

答案 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;
}