5 kyu
傳入秒數,轉換為人類可辨識的時間單位;最大的單位為小時。
傳統計時:秒 -> 分鐘 -> 小時;60秒 -> 1min,60min -> 1hr。
反過來推論,從小時開始倒推回剩餘秒數。
也就是一小時以秒數來計,60 * 60 = 1hr,先從小時開始扣,以此類推。
let lave = seconds % 3600
let hours = (seconds - lave) / 3600
let sec = lave % 60;
let mins = (lave - sec) / 60
let result = [hours, mins, sec];
result.map(item =>
if item.length < 2
return "0" + item
)
return result.join(":")
function humanReadable(seconds) {
let lave = seconds % 3600;
let hours = (seconds - lave) / 3600;
let sec = lave % 60;
let mins = (lave - sec) / 60;
let result = [hours, mins, sec].map(item => {
if (item < 10) return "0" + item;
return item;
});
return result.join(":");
}
一個小時的秒數為 3600。
將原始秒數取出餘數,也就是一部分被整除、一部分被剩餘;
扣除掉被剩餘的再除以 3600,即被整除的最終小時數。
剩餘秒數跟 60 取餘,得最終秒數;扣除最終秒數後,被整除的部分即為最終分鐘數。
將取得的小時、分鐘、秒數放於 Array 中,用 map 去迭代元素;設定判斷條件,回傳對應內容;再用 join 轉為字串結果。
function humanReadable(seconds) {
var pad = function (x) {
return (x < 10) ? "0" + x : x;
}
return pad(parseInt(seconds / (60 * 60))) + ":" +
pad(parseInt(seconds / 60 % 60)) + ":" +
pad(seconds % 60)
}
在函數內部宣告另一函數 pad,整個 humanReadable 會 return pad 函數的執行結果。
pad 函數會帶入一個參數 x,如果 x 小於10,回傳 x 與字串 0 的拼接,否則就直接回傳 x。
舉例 humanReadable 帶入 45296,第一行的 pad 其中的 x 為:45296 / (60*60)
,作法是將所有秒數除以一小時的秒數 3600,取整後為 12。
第二行 parseInt(45296 / 60 % 60)
,第一個除以六十取得以分鐘為單位,再以每小時 60 分,取得分鐘的餘數,取整後為 34。
第三行 seconds % 60
,排除能被 60 所整除的,剩餘的即為秒數了。
最後各自作為 x 帶入到 pad 之中,獲取對應結果。
才剛開始第二天就感受到沒有存稿的恐怖了OTL
他人的解法通常是拿該題目的最佳解,來思考過一遍別人的寫法。
目前觀察下來,寫越短或解法越少見,幾乎是最佳解的共通點。