這是一道我面試中遇到的演算法題,我覺得蠻有意思的所以寫出來與大家分享一下。
問題
給定一個時間值,需要計算出錶盤上時針與分針的之間的夾角度數。
思路
雖然題目中只有一個條件,但其實已經有許多隱含條件包括在內。
我們要得出的是時針和分針之間的角度,在一個鐘錶上因為鐘錶是圓形,所以我們得出第二個已知條件,錶盤360°;第三個已知條件,錶盤上有 12 個小時刻度;第三個已知條件,分針走一圈時針走一個刻度。
雖然題目裡沒有給出以上條件,但常識告訴我們這些條件。
拿到這些條件我們的計算就簡單了:
首先計算得出一些我們需要的數值,如每增加一小時時針走多少度,分針增加一分鐘走多少度,分針每走一分鐘帶動時針走多少度。
得到這些值後我們與給定的時間進行計算:
小時 * 每增加一小時時針走多少度 = 整點時間時時針度數
分鐘 * 分針每走一分鐘帶動時針走多少度 = 分針帶動時針度數
整點時間時時針度數 + 分針帶動時針度數 = 此時時針度數
分鐘 * 分針增加一分鐘走多少度 = 分針度數
此時時針度數 – 分針度數 = |夾角度數|
取絕對值就得出了它們之間的夾角度數
實現程式碼
Python 版
"""
給定一個時間值算出時針與分針直接的夾角度數
"""
import time
def calculate(times):
hour = times.tm_hour - 12 if times.tm_hour > 12 else times.tm_hour
minute = times.tm_min
# 鐘錶總度數
timekeeper_angle = 360
# 時間刻度份數
scale = 12
# 每份時間刻度佔用的度數
one_scale = timekeeper_angle / scale
# 分針每走1分鐘時針轉動的度數
one_relate_scale = one_scale / 60
# 分針每走1分鐘轉動的度數
one_minute_scale = timekeeper_angle / 60
# 小時*每份度數 得 整點時間的時針度數
integral_scale = hour * one_scale
# 分針帶動時針走的度數
relate_scale = minute * one_relate_scale
# 時針真正的起始點度數
relay_hour_scale = integral_scale + relate_scale
# 分鐘的現在度數
relay_minute_scale = minute * one_minute_scale
print(abs(relay_hour_scale - relay_minute_scale))
calculate(time.localtime(time.time()))複製程式碼
PHP 版
<?php
function calculate($time){
$hour = (int) date(`H`, $time);
$hour = $hour > 12 ? $hour - 12 : $hour;
$minute = (int) date(`m`, $time);
// 鐘錶總度數
$timekeeperAngle = 360;
// 時間刻度份數
$scale = 12;
// 每份時間刻度佔用的度數
$oneScale = $timekeeperAngle / $scale;
// 分針每走1分鐘時針轉動的度數
$oneRelateScale = $oneScale / 60;
// 分針每走1分鐘轉動的度數
$oneMinuteScale = $timekeeperAngle / 60;
// 小時*每份度數 得 整點時間的時針度數
$integralScale = $hour * $oneScale;
// 分針帶動時針走的度數
$relateScale = $minute * $oneRelateScale;
// 時針真正的起始點度數
$relayHourScale = $integralScale + $relateScale;
// 分鐘的現在度數
$relayMinuteScale = $minute * $oneMinuteScale;
echo abs($relayHourScale - $relayMinuteScale);
}
calculate(time());複製程式碼