ItIron2021
Javascript
你好阿,大哥哥! 沒想到你能撐過非同步的連續攻擊!
不過一切就到此為止了,接著就由我鎖鏈的康妮來做你的對手吧!
回味一下老梗,恭喜各位一路走到第25天,剩下的6天內容會是變為實際的應用題目,不再單一針對某個概念,反而會較為貼近白板題的情況(當然,難度比白板題可低多了,這系列並不涵蓋我實際遇過的白板題?)。 馬上來看一下今天的題目吧!
請你寫一個function isInteger(x),可以用來判斷x是否為整數
防雷圖~~
題目看起來很簡單嘛! 阿不就寫個函數判斷是否是整數? 大概就像這樣吧
function isInteger(x) {
return parseInt(x, 10) === x
}
isInteger(520) // true
isInteger(43.5) // false
isInteger(-35) // true
搞定! 我們明天見!
實際上你犯了很嚴重的錯誤,如果是筆試的問題且題目說明真的只有這樣,那我想以上的寫法問題不大(當然,還是有問題,等等說明),但如果這是在面對面口試拋出這樣的題目,以上的答案就特別不妥當了。
我有說這函數要回傳什麼嗎?這函數需要log出什麼訊息嗎?傳入的參數範圍你知道嗎? 是的,這些你都不知道,所以你不該貿然下手。
也許在文章中看起來你會覺得這根本他媽陷阱題,這我不否認,但實際上確認需求本來就是你該做的事情,因此在碰到這樣的題目時務必先釐清問題
OK,那我們進一步說明並重新定義題目
請你寫一個function isInteger(x),這函數最終會回傳一個boolean判斷x是否為整數,傳入的參數只會有數字,沒有時間複雜度與語法上的限制
這樣清楚多了,以下提供兩種常見的解法
我在之前的文章就提過了,如果JS本身已經有配合的語法,你就不需要去自己刻,這個情境下可以使用原生的Number.isInteger來處理
console.log(Number.isInteger(12520.32)) // false
console.log(Number.isInteger(-77.0)) // true
console.log(Number.isInteger(1252065461313.42)) // false
第二種思路則是將數字無條件捨去後判斷他與原本的數字是否相同
let x = 12520.32
let y = -77.0
let z = 1252065461313.42
console.log(parseInt(x) === x) // false
console.log(parseInt(y) === y) // true
console.log(Math.floor(z) === z) // false
不過以上的解法都有缺陷,但這個缺陷來自JS本身,我們之前在浮點數陷阱的部份談過JS採用的標準,在這個標準下存在一個安全數範圍,也就是2的53次方-1 以及-2的53次方-1
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_SAFE_INTEGER // -9007199254740991
超過這個範圍的數字在運算時就有可能會出現一些誤差,解法通常是透過一些第三方套件像是bigint.js等來處理,老樣子,後續的細節就交給你們啦!
isInteger、MAX_SAFE_INTEGER & MIN_SAFE_INTEGER
本文章同步發布於個人部落格,有興趣的朋友也可以來逛逛~!