时钟指针的夹角
难度:
标签:
题目描述
给你两个数 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`?
▷🦆
题解中提及的`30 * hour`部分在hour为12时是否应当考虑为0,以符合12小时制的钟表逻辑?
▷🦆
为什么分针每分钟移动的角度是6度?这个计算是如何得出的?
▷