A.每日一题:1344. 时钟指针的夹角

📅 2026/6/27 23:48:00
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 numminutes/5.0; double dhour-num; if(hour6) 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(hour6) 分支从少量特例总结出 “差值反向” 的规律试图分情况计算。本质原因用直觉代替数学推导分情况逻辑极易遗漏边界场景比如分针在时针左侧 / 右侧、跨 12 点位置等代码越写越乱还容易错。正确做法统一计算两针的绝对角度 → 求绝对差值 → 取最小角。全程无需分支判断逻辑简洁且无遗漏。易错点 4小时数未对 12 取模错误表现直接用 hour * 30 计算遇到 12 点、超过 12 点的数值时逻辑异常。本质原因时钟是 12 小时循环12 点的时针位置等价于 0 点而非 12×30360° 的位置。修正方式计算时针角度前先做 hour % 12把小时映射到 0~11 的刻度区间。易错点 5整数除法导致精度截断错误表现比如写 minutes / 5 而非 minutes / 5.0Java 中整数相除会直接舍弃小数部分。反例验证minutes7 时7/51整数除法但实际分针位置是 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); } }