[1344] 时钟指针的夹角
题目描述
给你两个数 hour 和 minutes。请你返回在时钟上,由给定时间的时针和分针组成的较小角的角度(单位:度)。
示例 1:
输入:hour = 12, minutes = 30
输出:165
示例 2:
输入:hour = 3, minutes = 30
输出:75
示例 3:
输入:hour = 3, minutes = 15
输出:7.5
提示:
1 <= hour <= 120 <= minutes <= 59
解题思路
算时钟夹角其实挺直观的,核心就是算出两根针各自离 12 点方向(0 度)转了多少度,然后看它们差了多少。
1. 分针角度
分针走一圈是 360 度,一共 60 分钟,所以每分钟走 6 度。 公式很简单:
$$ \text{minute_angle} = \text{minutes} \times 6 $$
2. 时针角度
时针每小时走 30 度(360 / 12),这点大家都知道。但别忘了,时针不是跳着走的,它也会跟着分钟慢慢挪。 每分钟时针走 0.5 度(30 / 60)。
所以时针的总角度是:
$$ \text{hour_angle} = (\text{hour} \bmod 12) \times 30 + \text{minutes} \times 0.5 $$
这里用 hour % 12 是为了处理 12 点的情况,因为 12 点在数学上等同于 0 度。
3. 计算夹角
算出两个角度后,取差值的绝对值:
$$ \text{diff} = |\text{hour_angle} - \text{minute_angle}| $$
因为时钟是个圆,两个指针之间其实有两个夹角(一个顺时针,一个逆时针),我们要的是那个小的。
如果 diff 超过 180 度,说明我们算的是大角,用 360 减去它就行:
$$ \text{result} = \min(\text{diff}, 360 - \text{diff}) $$
示例验证
拿几个例子跑一下逻辑:
-
hour=12, minutes=30:
- 时针角度 = $(12 \bmod 12) \times 30 + 30 \times 0.5 = 0 + 15 = 15°$
- 分针角度 = $30 \times 6 = 180°$
- diff = $|15 - 180| = 165°$
- result = $\min(165, 360 - 165) = 165°$ ✓
-
hour=3, minutes=30:
- 时针角度 = $(3 \bmod 12) \times 30 + 30 \times 0.5 = 90 + 15 = 105°$
- 分针角度 = $30 \times 6 = 180°$
- diff = $|105 - 180| = 75°$
- result = $\min(75, 360 - 75) = 75°$ ✓
-
hour=12, minutes=0:
- 时针角度 = $(12 \bmod 12) \times 30 + 0 \times 0.5 = 0°$
- 分针角度 = $0 \times 6 = 0°$
- diff = $|0 - 0| = 0°$
- result = $\min(0, 360 - 0) = 0°$ ✓
完整代码
Python 3
class Solution:
def angleClock(self, hour: int, minutes: int) -> float:
# 计算分针角度
minute_angle = minutes * 6
# 计算时针角度
hour_angle = (hour % 12) * 30 + minutes * 0.5
# 计算夹角
diff = abs(hour_angle - minute_angle)
# 返回较小的角
return min(diff, 360 - diff)
Java
class Solution {
public double angleClock(int hour, int minutes) {
double minuteAngle = minutes * 6.0;
double hourAngle = (hour % 12) * 30.0 + minutes * 0.5;
double diff = Math.abs(hourAngle - minuteAngle);
return Math.min(diff, 360 - diff);
}
}
C++
class Solution {
public:
double angleClock(int hour, int minutes) {
double minuteAngle = minutes * 6.0;
double hourAngle = (hour % 12) * 30.0 + minutes * 0.5;
double diff = std::abs(hourAngle - minuteAngle);
return std::min(diff, 360.0 - diff);
}
};
复杂度分析
- 时间复杂度:$O(1)$,只做了几个加减乘除,常数时间。
- 空间复杂度:$O(1)$,没开额外空间,就几个变量。

583

被折叠的 条评论
为什么被折叠?



