时钟指针的夹角

标签: 数学

难度: Medium

给你两个数 hour 和 minutes 。请你返回在时钟上,由给定时间的时针和分针组成的较小角的角度(60 单位制)。

示例 1:

输入:hour = 12, minutes = 30
输出:165

示例 2:

输入:hour = 3, minutes = 30
输出;75

示例 3:

输入:hour = 3, minutes = 15
输出:7.5

示例 4:

输入:hour = 4, minutes = 50
输出:155

示例 5:

输入:hour = 12, minutes = 0
输出:0

提示:

  • 1 <= hour <= 12
  • 0 <= minutes <= 59
  • 与标准答案误差在 10^-5 以内的结果都被视为正确结果。

Submission

运行时间: 24 ms

内存: 0.0 MB

class Solution:
    def angleClock(self, hour: int, minutes: int) -> float:
        h,m = 0, minutes * 6
        if hour == 12:
            h = minutes / 2
        else:
            h = 30*hour + minutes / 2
        if abs(h-m) > 180:
            return 360-abs(h-m)
        return abs(h-m)

Explain

此题解通过计算时针和分针当前的角度位置来找出它们之间的夹角。首先,分针每分钟移动6度(360度 / 60分钟 = 6度每分钟)。因此,分针的角度可以直接通过`minutes * 6`计算得出。对于时针,每小时移动30度(360度 / 12小时 = 30度每小时),但是时针在一小时内也会随着分钟的增加而移动。具体来说,每过一分钟,时针移动0.5度(30度 / 60分钟 = 0.5度每分钟)。因此,时针的角度由两部分组成:固定的小时数部分`30 * hour`和随分钟增加的变化部分`minutes / 2`。特别地,当小时数为12时,我们将其视为0点,因此只计算分钟带来的变化。计算出两针的角度后,求它们的差的绝对值得到夹角,如果这个角度大于180度,说明较小的夹角是360度减去计算出的角度。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def angleClock(self, hour: int, minutes: int) -> float:
        # 计算分针的角度
        m = minutes * 6
        # 计算时针的角度,考虑小时和分钟的影响
        if hour == 12:
            h = minutes / 2
        else:
            h = 30 * hour + minutes / 2
        # 计算两针的角度差
        angle_diff = abs(h - m)
        # 如果角度差大于180度,取补角
        if angle_diff > 180:
            return 360 - angle_diff
        return angle_diff

Explore

在12小时制的钟面上,12点被视作0点的位置。因此,当hour为12时实际上是一个周期的开始,与0点的位置相同。如果我们使用`30 * 12 + minutes / 2`,这将错误地表示为360度加上基于分钟的偏移,总会超出360度的范围。所以,当hour为12时,我们只考虑由分钟数引起的偏移`minutes / 2`,这样可以正确表示时针的位置。

是的,应当将`30 * hour`在hour为12时考虑为0。在12小时制的钟表中,12点与0点在钟面上是相同的位置,即顶部的12点位置。因此,尽管从数值上看12小时应对应360度(`30 * 12`),但在日常生活和时钟读数中,12点是一个周期的重新开始,所以逻辑上我们将其视为0。这样能确保时钟的读数与实际显示一致。

分针每分钟移动6度的计算基于整个钟面是一个360度的圆。一小时内有60分钟,所以分针需要在一小时内完成一圈,即360度。因此,每分钟分针移动的角度是 `360度 / 60分钟 = 6度`。这是根据钟面的总度数和每小时分钟数的基本除法计算得出的。