DOJO004

  • Dashool 創辦人
  • 喜歡調酒
  • Rails、Nextjs、TypeScript

來刷 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

退出迴圈。
 

版權所有 © 2023 DOJO004

Deployed on Zeabur