來刷 LeetCode 吧! 08 09.Palindrome Number
LeetCode
題目分析
給一個整數 x,若 x 相反過後相等( 迴文數 ),回傳 true 否則為 false。
第一直覺
直接將數字做轉換:
數字 > 字串 > 陣列 > 反轉 > 字串
最後再與 x 做比較。
var isPalindrome = function(x) { // 負數、最後一位為 0 都不是迴文樹 if (x < 0 || (x % 10 === 0 && x !== 0)) return false; let y = x.toString().split("").reverse().join("") console.log(x,y) return y === x.toString() };
最佳效能
看了解答才知道,原來 JS 在進行型別轉換時會耗費較多的效能。
直接操作數字進行反轉,效能較好。
var isPalindrome = function(x) { // 負數以及最後一位是0但數字不是0的情況下都不是迴文數 if (x < 0 || (x % 10 === 0 && x !== 0)) return false; let reversed = 0; let original = x; while (x > 0) { reversed = reversed * 10 + x % 10; x = Math.floor(x / 10); } return original === reversed; };
反轉數字的概念
宣告一個儲存反轉數字的 “reversed”。
將 x 的數字從個位數搬運至 “reversed”
ed:
x = 121
第一次迴圈:
reversed = 0 * 10 + 121 % 10 = 0 + 1 = 1 x = Math.floor(121 / 10) = 12
第二次迴圈:
reversed = 1 * 10 + 12 % 10 = 10 + 2 = 12 x = Math.floor(12 / 10) =1
第三次迴圈:
reversed = 12 * 10 + 1 % 10 = 120 + 1 = 121 x = Math.floor(1 / 10) = 0
退出迴圈。