A.每日一题:1344. 时钟指针的夹角
题目链接:1344. 时钟指针的夹角(中等)
算法原理:
我们简单找找规律~~
差值为6:180°
差值为9:90°
类似的:
差值为11:30°
差值为10:60°
差值为8:120°
度数=(12-差值)✖️30°
左半边相反:差值✖️30°
有的同学就直接写成了⬇️
class Solution { //1344. 时钟指针的夹角 public double angleClock(int hour, int minutes) { //差值为6:180° //差值为9:90° //类似的: //差值为11:30° //差值为10:60° //差值为8:120° //度数=(12-差值)✖️30° //左半边相反:差值✖️30° double num=minutes/5.0; double d=hour-num; if(hour<6) return (12-d)*30%180; return d*30%180; } }但结果⬇️
关键易错点复盘
易错点 1:时针位置忽略分钟带来的偏移(最核心高频错误)
错误表现:直接用整点小时数计算时针位置(比如 3:30 默认时针在数字 3 处),最终结果偏差固定数值(如这里差了 15°)
本质原因:对时钟运行逻辑的直觉错误 —— 时针不是整点才 “跳一格”,分针转动时,时针会同步匀速偏移
量化规则:时针每小时走 30°(360°÷12),对应每分钟走 0.5°(30°÷60);也可以理解为:每过 1 分钟,时针前进 1/60 个大刻度。
修正方式:时针角度 = (hour % 12) × 30° + minutes × 0.5
易错点 2:用 % 180 求最小夹角(逻辑完全错误)
错误表现:试图用角度对 180 取模,直接得到较小角
本质原因:混淆了 “取模运算” 和 “取圆周短弧” 的逻辑。取模是求余数,不是求 360° 圆周上的补角
反例验证:若两针角度差为 200°,较小角应为 360°-200°=160°;但 200 % 180 = 20,结果完全错误
正确做法:Math.min(差值, 360 - 差值),永远取两个夹角中更小的那个
易错点 3:臆造 “分情况、分左右” 的夹角规律
错误表现:比如你代码里的 if(hour<6) 分支,从少量特例总结出 “差值反向” 的规律,试图分情况计算。
本质原因:用直觉代替数学推导,分情况逻辑极易遗漏边界场景(比如分针在时针左侧 / 右侧、跨 12 点位置等),代码越写越乱还容易错。
正确做法:统一计算两针的绝对角度 → 求绝对差值 → 取最小角。全程无需分支判断,逻辑简洁且无遗漏。
易错点 4:小时数未对 12 取模
错误表现:直接用 hour * 30 计算,遇到 12 点、超过 12 点的数值时逻辑异常。
本质原因:时钟是 12 小时循环,12 点的时针位置等价于 0 点,而非 12×30=360° 的位置。
修正方式:计算时针角度前先做 hour % 12,把小时映射到 0~11 的刻度区间。
易错点 5:整数除法导致精度截断
错误表现:比如写 minutes / 5 而非 minutes / 5.0,Java 中整数相除会直接舍弃小数部分。
反例验证:minutes=7 时,7/5=1(整数除法),但实际分针位置是 1.4 个刻度,误差会被放大
修正方式:涉及刻度、角度计算时,强制使用浮点数运算(除数写为 5.0、60.0 等)
易错点 6:分针 / 时针转速公式记错
错误表现:混淆指针转速,比如误以为分针每分钟走 1°、每大刻度对应 6 分钟等
核心公式必须记牢:
分针:每分钟走 6°(360° ÷ 60 分钟)
时针:每小时走 30°(360° ÷ 12 小时),每分钟走 0.5°解法一:刻度法
0ms击败100.00%
时间复杂度O(1)
1️⃣分针所在的刻度位置(每5分钟1个大刻度)
2️⃣时针所在的刻度位置(整点刻度 + 分钟带来的偏移)
3️⃣刻度差的绝对值
4️⃣每个刻度对应 30 度
5️⃣取较小夹角
解法二:角度法
0ms击败100.00%
时间复杂度O(1)
1️⃣计算分针角度:每分钟走 6 度 (360/60)
2️⃣计算时针角度:整点走 30 度/小时 + 分钟偏移 0.5 度/分钟
3️⃣求两针角度差的绝对值
4️⃣返回较小的夹角(圆周 360 度,取小的那段弧)
Java代码:
class Solution { //1344. 时钟指针的夹角 //解法一:刻度法 public double angleClock(int hour, int minutes) { // 分针所在的刻度位置(每5分钟1个大刻度) double minuteMark = minutes / 5.0; // 时针所在的刻度位置(整点刻度 + 分钟带来的偏移) double hourMark = (hour % 12) + minutes / 60.0; // 刻度差的绝对值 double diffMark = Math.abs(hourMark - minuteMark); // 每个刻度对应 30 度 double angle = diffMark * 30; // 取较小夹角 return Math.min(angle, 360 - angle); } }class Solution { //1344. 时钟指针的夹角 //解法二:角度法 public double angleClock(int hour, int minutes) { // 1. 计算分针角度:每分钟走 6 度 (360/60) double minuteAngle = minutes * 6.0; // 2. 计算时针角度:整点走 30 度/小时 + 分钟偏移 0.5 度/分钟 // hour%12 处理 12 点等价于 0 点的情况 double hourAngle = (hour % 12) * 30.0 + minutes * 0.5; // 3. 求两针角度差的绝对值 double diff = Math.abs(hourAngle - minuteAngle); // 4. 返回较小的夹角(圆周 360 度,取小的那段弧) return Math.min(diff, 360 - diff); } }