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

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

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

示例 1:

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

解释:

示例 2:

输入:num = 4, Xpos = 1, Ypos = 2
输出:5

解释:

提示:

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

Python 解答:
1.暴力超时

class Solution:
    def orchestraLayout(self, num: int, xPos: int, yPos: int) -> int:
        dir = [(0,1), (1, 0), (0,-1), (-1,0)]
        ini = [0,0]
        i, j, length = 0, 0, num
        while length > 0:
            for n in range(3):
                for k in range(length-1):
                    ini[0] += dir[i][0]
                    ini[1] += dir[i][1]
                    j += 1
                    if ini[0] == xPos and ini[1] == yPos:
                        return (j+1) % 9 if (j+1) % 9 != 0 else 9
                i = (i+1)%4
            for k in range(length-2):
                ini[0] += dir[i][0]
                ini[1] += dir[i][1]
                j += 1
                if ini[0] == xPos and ini[1] == yPos:
                    return (j+1) % 9 if (j+1) % 9 != 0 else 9
            i = (i+1)%4
            ini[1] += 1
            j += 1
            if ini[0] == xPos and ini[1] == yPos:
                return (j+1) % 9 if (j+1) % 9 != 0 else 9            
            length -= 2

2.改进一下

class Solution:
    def orchestraLayout(self, num: int, xPos: int, yPos: int) -> int:
        layer = min(xPos, num-xPos-1, yPos, num-yPos-1)
        out = num*num-(num-2*layer)*(num-2*layer)
        i, j = layer, num-layer-1
        if xPos == i:
            out += yPos-i+1
        elif yPos == j:
            out += j-i + xPos-i+1
        elif xPos == j:
            out += 2*(j-i) + j-yPos+1
        else:
            out += 3*(j-i) + j-xPos+1
        res = out%9
        if res:
            return res
        else: return 9
最后修改日期: 2021年6月15日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。