Medium
题目描述
给定两个数字,hour 和 minutes,返回时针和分针之间形成的较小夹角(以度为单位)。
与实际值相差在 10^-5 以内的答案将被视为正确答案。
示例 1:
输入:hour = 12, minutes = 30
输出:165
示例 2:
输入:hour = 3, minutes = 30
输出:75
示例 3:
输入:hour = 3, minutes = 15
输出:7.5
约束条件:
- 1 <= hour <= 12
- 0 <= minutes <= 59
提示:
- 关键是确定分针如何影响时针的位置。
- 分别计算角度,然后求差值。
解题思路
这道题需要计算时钟上时针和分针之间的夹角。
核心思路:
- 分针角度计算:分针每分钟转动 6 度(360° ÷ 60 = 6°),所以分针角度 = minutes × 6
- 时针角度计算:时针每小时转动 30 度(360° ÷ 12 = 30°),每分钟转动 0.5 度(30° ÷ 60 = 0.5°),所以时针角度 = (hour % 12) × 30 + minutes × 0.5
- 求夹角:计算两个角度的差值的绝对值
- 取较小角:如果夹角大于 180 度,则实际夹角为 360 - 夹角
关键点:
- 注意时针会随着分钟数连续移动,不是只在整点位置
- hour = 12 需要转换为 0(12 点等同于 0 点)
- 最终返回的是较小的夹角(≤ 180°)
时间复杂度 O(1),空间复杂度 O(1),这是一个纯数学计算问题。
代码实现
class Solution {
public:
double angleClock(int hour, int minutes) {
// 分针角度:每分钟6度
double minuteAngle = minutes * 6.0;
// 时针角度:每小时30度 + 每分钟0.5度
double hourAngle = (hour % 12) * 30.0 + minutes * 0.5;
// 计算夹角
double diff = abs(hourAngle - minuteAngle);
// 返回较小的角度
return min(diff, 360.0 - diff);
}
};
class Solution:
def angleClock(self, hour: int, minutes: int) -> float:
# 分针角度:每分钟6度
minute_angle = minutes * 6
# 时针角度:每小时30度 + 每分钟0.5度
hour_angle = (hour % 12) * 30 + minutes * 0.5
# 计算夹角
diff = abs(hour_angle - minute_angle)
# 返回较小的角度
return min(diff, 360 - diff)
public class Solution {
public double AngleClock(int hour, int minutes) {
// 分针角度:每分钟6度
double minuteAngle = minutes * 6.0;
// 时针角度:每小时30度 + 每分钟0.5度
double hourAngle = (hour % 12) * 30.0 + minutes * 0.5;
// 计算夹角
double diff = Math.Abs(hourAngle - minuteAngle);
// 返回较小的角度
return Math.Min(diff, 360.0 - diff);
}
}
/**
* @param {number} hour
* @param {number} minutes
* @return {number}
*/
var angleClock = function(hour, minutes) {
// 分针角度:每分钟6度
const minuteAngle = minutes * 6;
// 时针角度:每小时30度 + 每分钟0.5度
const hourAngle = (hour % 12) * 30 + minutes * 0.5;
// 计算夹角
const diff = Math.abs(hourAngle - minuteAngle);
// 返回较小的角度
return Math.min(diff, 360 - diff);
};
复杂度分析
| 复杂度类型 | 复杂度 |
|---|---|
| 时间复杂度 | O(1) |
| 空间复杂度 | O(1) |