记一道数字旋转排列算法题

Posted 编程随写

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一道数字旋转排列算法题相关的知识,希望对你有一定的参考价值。

记一道数字旋转排列算法题

面试的时候遇到一道算法题,当时没做出来,也没有什么思路。睡觉前突然想到解法,记录一下。

题的大意如下,数字以1开始,并围绕1做逆时针旋转,其中1的坐标为(0, 0),如下图所示:

技术图片

要求给一个坐标,求其未知的数是多少?例:给出(1, 0),该坐标的数为2;给出(-1, -2),该坐标上的数为22。

说下解题思路,由点的坐标可以得出目标值所在的圈数p,比如5在第2圈,p的大小为坐标x或y较大绝对值n再+1,比如18为(-2,1),绝对值n为2,则18在第3圈(n+1),然后从(n, -n)顺时针穷举该圈的数即可。

代码实现:

public int getTheNumber(int x, int y) {
    if (x == 0 && y == 0) {
        return 1;
    }
    int n = Math.max(Math.abs(x), Math.abs(y));
    int p = n + 1;//圈数
    int max = (2 * p - 1) * (2 * p - 1);//所在圈的最大值

    int x1 = n;
    int y1 = -n;
    int res = max;
    while (x1 != x || y1 != y) {//从最大值开始顺时针依次递减,直到找到坐标的数
        res--;

        if (x1 > -n && y1 == -n) {
            x1--;
            continue;
        }
        if (x1 == -n && y1 < n) {
            y1++;
            continue;
        }
        if (x1 < n && y1 == n) {
            x1++;
            continue;
        }
        if (x1 == n && y1 > -n) {
            y1--;
        }
    }
    return res;
}

突然又想到如果问题是给一个数,求它的坐标呢?
思路也是一样的,先求出这个数所在的区间,也就是第几圈,然后穷举233333感觉有点蠢啊不过没其他思路了

以上是关于记一道数字旋转排列算法题的主要内容,如果未能解决你的问题,请参考以下文章

记一道字节跳动的算法面试题

每周一道算法题003:翻牌

算法是什么我记不住,But i do it my way. 解一道滴滴出行秋招编程题。

[位运算]签到题

记一道比较有意思的面试题

算法-旋转图像(矩阵处理)