求鐘錶時針和分鐘夾角演算法問題

麥索發表於2019-03-02

這是一道我面試中遇到的演算法題,我覺得蠻有意思的所以寫出來與大家分享一下。

問題

給定一個時間值,需要計算出錶盤上時針與分針的之間的夾角度數。

思路

雖然題目中只有一個條件,但其實已經有許多隱含條件包括在內。

我們要得出的是時針和分針之間的角度,在一個鐘錶上因為鐘錶是圓形,所以我們得出第二個已知條件,錶盤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());複製程式碼

相關文章