LeetCode Everyday - 乐团站位

53 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情 >>

乐团站位

某乐团的演出场地可视作 num * num 的二维矩阵 grid(左上角坐标为 [0,0]),每个位置站有一位成员。乐团共有 9 种乐器,乐器编号为 1~9,每位成员持有 1 个乐器。

为保证声乐混合效果,成员站位规则为:自 grid 左上角开始顺时针螺旋形向内循环以 1,2,...,9 循环重复排列。例如当 num = 5 时,站位如图所示

image.png

请返回位于场地坐标 [Xpos,Ypos] 的成员所持乐器编号。

示例1:

输入:`num = 3, Xpos = 0, Ypos = 2`

输出:`3`

解释:

image.png

示例2:

输入:`num = 4, Xpos = 1, Ypos = 2`

输出:`5`
解释:

image.png

提示:

  • 1 <= num <= 10^9
  • 0 <= Xpos, Ypos < num

解题思路:

看成一圈一圈的正方形,然后定位点A(x,y)在第几个圈,然后计算,点A所处的圈的所有外圈的和,他们是等差数列。最后就是判断点A在正方形的上边还是右边还是下边,还是左边,分别添加即可。

我的答案:

/**
 * @param {number} num
 * @param {number} xPos
 * @param {number} yPos
 * @return {number}
 */
var orchestraLayout = function(num, xPos, yPos) {
    let rectSum = 0
    // 判断第几层
    let whichRect = (Math.min(num - xPos - 1, xPos, yPos, num - yPos - 1))
    // 计算外圈和(直接除以9取余, 获取最后一位站位号码)
    rectSum = (4 * whichRect % 9 * ((num - whichRect) % 9)) % 9
    // 判断位置(上下左右)
    xPos = xPos - whichRect
    yPos = yPos - whichRect
    let tempSum = num - (whichRect) * 2

    if (xPos === 0) {
        return (rectSum + yPos + 1) % 9 === 0 ? 9 : (rectSum + yPos + 1) % 9
    } else if (yPos === 0) {
        return (rectSum + tempSum * 4 - 3 - xPos) % 9 === 0 ? 9 : (rectSum + tempSum * 4 - 3 - xPos) % 9
    } else if (yPos + 1 === tempSum) {
        return (rectSum + tempSum + xPos) % 9 === 0 ? 9 : (rectSum + tempSum + xPos) % 9
    } else {
        return (rectSum + tempSum * 3 - 3 - yPos + 1) % 9 === 0 ? 9 : (rectSum + tempSum * 3 - 3 - yPos + 1) % 9
    }
};

最后

如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )