leetcode
leetcode 1251 ~ 1300
时钟指针的夹角

时钟指针的夹角

难度:

标签:

题目描述

给你两个数 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 以内的结果都被视为正确结果。

代码结果

运行时间: 24 ms, 内存: 0.0 MB


/*
 * 思路:
 * 1. 使用Java Stream不太适合计算这种涉及到多个步骤和状态的数学问题。
 * 2. 但我们可以使用stream来处理一些输入输出的流程。
 */
import java.util.stream.*;

public class ClockAngleStream {
    public double angleClock(int hour, int minutes) {
        double hourAngle = (hour % 12 + minutes / 60.0) * 30;
        double minuteAngle = minutes * 6;
        double angle = Math.abs(hourAngle - minuteAngle);
        return Math.min(angle, 360 - angle);
    }

    public static void main(String[] args) {
        ClockAngleStream cas = new ClockAngleStream();
        int[][] times = { {12, 30}, {3, 30}, {3, 15}, {4, 50}, {12, 0} };
        double[] results = Stream.of(times)
                                 .mapToDouble(t -> cas.angleClock(t[0], t[1]))
                                 .toArray();
        for (double result : results) {
            System.out.println(result);
        }
    }
}

解释

方法:

此题解通过计算时针和分针当前的角度位置来找出它们之间的夹角。首先,分针每分钟移动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)

代码细节讲解

🦆
在题解中,当hour为12时,为什么将时针的位置设置为`minutes / 2`而不是`30 * 12 + minutes / 2`?
在12小时制的钟面上,12点被视作0点的位置。因此,当hour为12时实际上是一个周期的开始,与0点的位置相同。如果我们使用`30 * 12 + minutes / 2`,这将错误地表示为360度加上基于分钟的偏移,总会超出360度的范围。所以,当hour为12时,我们只考虑由分钟数引起的偏移`minutes / 2`,这样可以正确表示时针的位置。
🦆
题解中提及的`30 * hour`部分在hour为12时是否应当考虑为0,以符合12小时制的钟表逻辑?
是的,应当将`30 * hour`在hour为12时考虑为0。在12小时制的钟表中,12点与0点在钟面上是相同的位置,即顶部的12点位置。因此,尽管从数值上看12小时应对应360度(`30 * 12`),但在日常生活和时钟读数中,12点是一个周期的重新开始,所以逻辑上我们将其视为0。这样能确保时钟的读数与实际显示一致。
🦆
为什么分针每分钟移动的角度是6度?这个计算是如何得出的?
分针每分钟移动6度的计算基于整个钟面是一个360度的圆。一小时内有60分钟,所以分针需要在一小时内完成一圈,即360度。因此,每分钟分针移动的角度是 `360度 / 60分钟 = 6度`。这是根据钟面的总度数和每小时分钟数的基本除法计算得出的。

相关问题