SDE · Phone Coding

Amazon Coding:时钟夹角,时针在分钟内也移动

小时归一化、连续时针位置、较小夹角与整数算术;避免仅按小时整点计算。

题目重点:小时归一化、连续时针位置、较小夹角与整数算术;避免仅按小时整点计算。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 24小时hour为0..23整数,minute为0..59整数,无seconds;输出度数,范围[0,180]。
  • 时针连续转动,不是每整点跳一步。原题是否含秒、返回有向角或精度政策未给,保留待核。

解题路线

  1. 分钟一圈60分钟,分针角度6m;小时一圈12小时,时针角度30(h mod12)+0.5m。两者都以12点方向为0。
  2. 先绝对差delta,再取min(delta,360−delta),固定较小非有向夹角。不在hour处忘记mod12,否则下午可能超出一圈。
  3. 整数输入可先计算两倍差abs(60(h mod12)−11m),再与720−差取min,最后除2。所有合法结果是0.5度的整数倍,避免前段不必要浮点累积。
  4. 秒参数若加入,分针+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。
  • 给秒只移动分针。

继续深挖

  • 加入秒怎样保持精确有理数?
  • 给有向角怎样计算?
  • 一天内何时两针重合,连续时间如何求?
✓已复制微信号!