时钟指针的夹角

119 阅读2分钟

这是我参与「掘金日新计划 · 2 月更文挑战」的第 25 天,点击查看活动详情

问题描述

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

思路分析

首先我们先要理解一下题目意思,题目会给我们两个数字,分别代表小时和分钟,我们需要计算在给点时间下的时针和分针之间的夹角,夹角我们取较小的一个。首先我们应该分析一下时间与角度的关系:

  • 小时

每 12 个小时时针会转满一圈,也就是转动 360 度,那么每一个小时时针转动的角度就会是360 / 12 = 30°,所以每过n个小时,时针会转动n * 30°

  • 分钟

每 60 分钟分针会转满一圈,也就是转动 360 度,那么我们可以求得每一分钟分钟的转动角度为360 / 60 = 6°,所以每过n分钟,分针会转动n * 6°;

这里需要注意的是,分钟也会对时针的角度造成影响,一个小时时针转动30度,也就是说 60 分钟转动30度,即是每分钟转动30 / 60 = 0.5°

  • 时针转动角度

按照前面得出结论进行计算即可:

let hd = hour * 30 + minutes / 2;
  • 分针转动角度

按照前面得出结论进行计算即可:

let md = minutes * 6;
  • 计算夹角

夹角我们应该取较小的一个,两边的夹角之和为360°,我们知道一个角的度数之后即可知道另一个叫的度数:

Math.min(Math.abs(md - hd), 360 - Math.abs(md - hd));

完整 AC 代码如下:

AC 代码

/**
 * @param {number} hour
 * @param {number} minutes
 * @return {number}
 */
var angleClock = function (hour, minutes) {
  let hd = hour * 30 + minutes / 2;
  let md = minutes * 6;
  return Math.min(Math.abs(md - hd), 360 - Math.abs(md - hd));
};

说在后面

本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。