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

提示:

  • 关键是确定分针如何影响时针的位置。
  • 分别计算角度,然后求差值。

解题思路

这道题需要计算时钟上时针和分针之间的夹角。

核心思路:

  1. 分针角度计算:分针每分钟转动 6 度(360° ÷ 60 = 6°),所以分针角度 = minutes × 6
  2. 时针角度计算:时针每小时转动 30 度(360° ÷ 12 = 30°),每分钟转动 0.5 度(30° ÷ 60 = 0.5°),所以时针角度 = (hour % 12) × 30 + minutes × 0.5
  3. 求夹角:计算两个角度的差值的绝对值
  4. 取较小角:如果夹角大于 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)