深蓝黑背景封面。左上角标注「面试经典 · 算法」,右上角圆角胶囊写「Day 03 · 11-30」。左侧是一只大表盘,十二根刻度,时针(粗白)、分针(紫色)、秒针(细青色)全部指向 12 点方向交叠在一起,表盘下方标注「0:00(12:00)—— 24 小时里三针仅有的两次同框之一」。表盘右侧是角速度卡:时针 30°/小时、分针 360°/小时、秒针 21600°/小时,并给出三组相对速度「分−时 330°/小时」「秒−分 354°/分钟」「秒−时 359.5°/分钟」。左下结论条写「24 小时:分针追上时针 22 次 | 秒针追上分针 1416 次 | 秒针追上时针 1438 次 | 三针同框仅 2 次」。右侧大标题「时针分针秒针 一天到底重合多少次」,副标题「相对速度 × 追及模型:把钟表题变成三道除法」,小注「边界陷阱:0 点与 24 点是同一刻,只能计一次」。 图 1:本文封面,三组角速度与四个答案一览。

先说明属性:这是一篇经典题解析,题目出自本地历史面试资料整理,与任何公司的当前招聘无关。钟表重合题看着像脑筋急转弯,真正考的是你能不能把它翻译成相对速度的追及模型——会建模的人眼里,这题就是三道除法加一处边界判断。

追及模型:快针每多转一整圈,就重合一次。

先把三根针的角速度摆出来:时针一圈 12 小时,即 0.5°/分钟;分针一圈 1 小时,即 6°/分钟;秒针一圈 1 分钟,即 360°/分钟。两针重合的本质是追及:快针相对慢针的角速度 v = v快 − v慢,每相对多转过 360° 就重合一次,重合周期 T = 360° ÷ v。24 小时共 1440 分钟,重合次数 = 1440 ÷ T = v × 1440 ÷ 360——也就是快针比慢针多转的整圈数。模型建好,剩下全是代入:

  • 分针追时针:相对速度 5.5°/分钟,5.5 × 1440 ÷ 360 = 22 次;
  • 秒针追分针:相对速度 354°/分钟,354 × 1440 ÷ 360 = 1416 次;
  • 秒针追时针:相对速度 359.5°/分钟,359.5 × 1440 ÷ 360 = 1438 次。

三个数恰好都是整数,这不是巧合:24 小时结束时三根针都回到 12 点,套圈数必然取整。

这里有个值得停下来检查的直觉:秒针一分钟转一圈,有人会觉得秒针和分针每分钟都重合一次,24 小时该有 1440 次。错在忽略了分针自己也在走——秒针转完一圈回到原位时,分针已经向前挪了 6°,秒针得多追这 6° 才能再次遇上,追及周期因此是 60/59 分钟而不是 1 分钟,每小时少追上约一次,全天 1440 × 59/60 = 1416 次。「慢针不是静止的」正是相对速度要取差值的原因,也是面试官顺着追问的第一个点。

三针同框为什么只有 2 次。

三针重合,必先满足分针追上时针。12 小时内分针与时针重合 11 次,把周期 720/11 分钟(约 65 分 27 秒)逐个累加,可以得到完整的时刻表:0:00、约 1:05:27、约 2:10:55、约 3:16:22、约 4:21:49、约 5:27:16、约 6:32:44、约 7:38:11、约 8:43:38、约 9:49:05、约 10:54:33——两针的位置均匀分布在表盘上,相邻两次间隔完全相同。而秒针每分钟转一整圈,只有当时刻恰好是整分钟数时它才指向 12 点方向。上面 11 个时刻里带小数秒的统统出局,只有 0:00(即 12:00)满足三针同位置。所以 12 小时内三针同框仅一次,24 小时共 2 次:0:00 与 12:00。

边界陷阱:0 点与 24 点是同一刻。

表盘 12 小时转一整圈、首尾相接,0:00 与 24:00 是同一瞬间,只能计一次。被问「12 小时分针时针重合几次」,答 12 就掉坑了——把首尾各算一遍,正确答案是 11;同理 24 小时是 22 而不是 23。把首尾重复计数,是这类题最常见的「多数一次」错误。

用代码把推导验一遍。

口算容易心虚,写个小脚本做交叉验证(Node.js 22.15.0,node clock.js):套圈数直接按相对速度算,三针重合则枚举分-时重合时刻、检查秒针是否同位置:

function coincidences(vFast, vSlow, totalMinutes) {
  return (vFast - vSlow) * totalMinutes / 360; // 套圈数 = 重合次数
}
console.log(`分针追上时针 ${coincidences(6, 0.5, 1440)} 次`);
console.log(`秒针追上分针 ${coincidences(360, 6, 1440)} 次`);
console.log(`秒针追上时针 ${coincidences(360, 0.5, 1440)} 次`);
let triple = 0;
for (let k = 0; k < 22; k++) {
  const tMin = k * 720 / 11;                    // 分-时第 k 次重合
  if (Math.abs((0.5 * tMin) % 360 - (360 * tMin) % 360) < 1e-9) triple++;
}
console.log(`三针同框 ${triple} 次`);

实测输出:

分针追上时针 22 次
秒针追上分针 1416 次
秒针追上时针 1438 次
三针同框 2 次

与推导完全一致。

深蓝黑背景概念图。顶部小字「概念图 · 时钟重合的追及计数」,主标题「每多转一整圈就重合一次,剩下都是除法」。上部左侧是追及模型卡:快针相对慢针的角速度 v = v快 − v慢,每经过 T = 360° ÷ v 重合一次,重合次数 = 总时间 ÷ T(首尾同刻只算一次),卡内配两条同心圆弧箭头示意快针套圈。上部右侧是三针重合卡:三针重合必先满足分针追上时针,12 小时内 11 个重合时刻里只有 0:00(12:00)秒针恰好在同一位置,其余 10 个时刻秒针都在别处,因此 24 小时共 2 次。中部是三行推导表:第一行「分针 vs 时针」相对速度 330°/小时,追及周期 360÷330 = 12/11 小时/次,24 ÷ (12/11) = 22 次;第二行「秒针 vs 分针」相对速度 354°/分钟,周期 60/59 分钟/次,1440 ÷ (60/59) = 1416 次;第三行「秒针 vs 时针」相对速度 359.5°/分钟,周期 720/719 分钟/次,1440 ÷ (720/719) = 1438 次。底部边界条写:12 小时转一整圈首尾相接,0:00 与 24:00 是同一瞬间只计一次,把首尾各算一遍是这类题最常见的「多数一次」错误。 图 2:追及模型、三行推导与边界陷阱。

面试现场的答题结构。

先给模型一句话:「快针每多转一整圈重合一次,次数就是套圈数」,然后报角速度、列三道除法,22、1416、1438 脱口而出。三针重合单独处理:先退到分-时重合的 11 个时刻,再用「秒针只有整点才在 12 点方向」筛到只剩 0:00 与 12:00。收尾主动交代边界:首尾同刻只计一次,12 小时口径是 11 次。答到「把计数问题翻译成相对速度」这一层,面试官要的结构化能力就展示完了。你被问过印象最深的小学奥数式面试题是哪道?当时是怎么建模的?欢迎分享。