题目重点:小时归一化、连续时针位置、较小夹角与整数算术;避免仅按小时整点计算。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 24小时hour为0..23整数,minute为0..59整数,无seconds;输出度数,范围[0,180]。
- 时针连续转动,不是每整点跳一步。原题是否含秒、返回有向角或精度政策未给,保留待核。
解题路线
- 分钟一圈60分钟,分针角度6m;小时一圈12小时,时针角度30(h mod12)+0.5m。两者都以12点方向为0。
- 先绝对差delta,再取min(delta,360−delta),固定较小非有向夹角。不在hour处忘记mod12,否则下午可能超出一圈。
- 整数输入可先计算两倍差abs(60(h mod12)−11m),再与720−差取min,最后除2。所有合法结果是0.5度的整数倍,避免前段不必要浮点累积。
- 秒参数若加入,分针+0.1s、时针+s/120,不能仅给分针加秒。若要求有向顺时针角则用mod360而不是取较小角,必须重定输出合同。
手动走一遍
3:30时针105°、分针180°,小角75°,不是只按3点时针90°得到90°。12:00为0°,18:00为180°,23:59为5.5°。全1,440个合法24小时分钟与独立有理数圈数模1计算对照通过。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def smaller_angle(hour, minute):
"""Integer hour 0..23, minute 0..59; continuous hour hand, no seconds."""
if not isinstance(hour, int) or not isinstance(minute, int):
raise ValueError("integer hours and minutes required")
if not 0 <= hour < 24 or not 0 <= minute < 60:
raise ValueError("time out of range")
# Twice the signed angle, keeps the arithmetic integral until output.
difference = abs(60 * (hour % 12) - 11 * minute)
difference = min(difference, 720 - difference)
return difference / 2
复杂度
O(1)时间和空间,输入固定范围;秒或fractional time合同另计精度。
易错点与追问
容易失分的边界
- 时针只按小时整点。
- 下午不mod12。
- 只返回绝对差可能大于180。
- 给秒只移动分针。
继续深挖
- 加入秒怎样保持精确有理数?
- 给有向角怎样计算?
- 一天内何时两针重合,连续时间如何求?
