LeetCode 每日一题笔记 日期:2026.06.18 题目:1344. 时钟指针的夹角

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.06.18
  • 题目:1344. 时钟指针的夹角
  • 难度:中等
  • 标签:数学、模拟

1. 题目理解

问题描述

给定小时 hour 和分钟 minutes,计算时针与分针形成的较小夹角(角度制,0~180)。

规则:

  1. 分针每分钟走6°;
  2. 时针每小时走30°,每分钟额外走0.5°;
  3. 两指针夹角取 min(差值, 360-差值)

示例

输入:hour = 12, minutes = 30

输出:165.0

解释:分针在180°,时针在15°,差值165°,小于180直接返回。

2. 解题思路

核心观察

  1. 分针角度公式:minutes * 6.0
  2. 时针角度公式:(hour % 12) * 30.0 + minutes * 0.5
  3. 夹角绝对值 diff,最终结果取 min(diff, 360 - diff)
  4. 可使用Math.min消除if条件分支。

算法步骤

  1. 分别计算时针、分针的绝对角度;
  2. 求两个角度差值的绝对值;
  3. 取差值与360-差值中的较小值返回。

3. 代码实现

java 复制代码
class Solution {
    public double angleClock(int hour, int minutes) {
        double time =(hour+((double)minutes/60))*5%60;
        double a = Math.abs(time-minutes);
        double res = a*6;
        if(a*6>180){
            return (double)360-a*6;
        }
        return a*6;
    }
}

4. 代码优化说明

java 复制代码
class Solution {
public double angleClock(int hour, int minutes) {
    // 计算时针总角度,小时模12适配12点
    double hAngle = (hour % 12) * 30.0 + minutes * 0.5;
    // 分针每分钟6度
    double mAngle = minutes * 6.0;
    // 两指针角度差绝对值
    double diff = Math.abs(hAngle - mAngle);
    // 使用Math.min替代if分支,直接取更小夹角
    return Math.min(diff, 360.0 - diff);
}
}

5. 复杂度分析

  • 原始代码
    时间复杂度:O(1)O(1)O(1),仅常数数学运算;存在if分支判断
    空间复杂度:O(1)O(1)O(1),无额外内存占用
  • 优化代码
    时间复杂度:O(1)O(1)O(1),纯数学计算,消除条件分支跳转
    空间复杂度:O(1)O(1)O(1),变量更少,公式直观易读

6. 总结

  • 核心:通过数学公式分别计算时针、分针角度,再取最小夹角;
  • 优化亮点:用Math.min替换if判断,减少分支;拆分时针分针计算,逻辑更直观;
  • 关键公式:时针(hour%12)*30 + 0.5*min,分针6*min,最小夹角min(diff,360-diff)