1. 程式人生 > >LeetCode 第9題 迴文數 -- JavaScript

LeetCode 第9題 迴文數 -- JavaScript

題目描述:

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。並且我們假設所輸入的數字為整數。

示例:

輸入: 121
輸出: true
輸入: -121
輸出: false
輸入: 10
輸出: false

方法分析:

迴文數的定義很簡單,也很明確,即正序和逆序相等。下面我將採取兩種方法來分析此題。

1.將整數轉換為字串:通過該方法,只需比較第1位和最後1位是否相同,第2位與倒數第2位是否相同,...,依次類推。若該數字共有n位,則最多需比較 n/2 次。

程式碼實現(method 1):

 var isPalindrome = function(x) {
    var intToStr = x.toString();
    for (var i = 0; i < intToStr.length / 2; i++) {
        if(intToStr[i] != intToStr[intToStr.length - 1 - i]){
            return false;
        }
    }
    return true;
};

程式碼解析(method 1):

上面程式碼的演算法比較簡單,即將數字轉換為字串再進行比較。

該演算法的時間複雜度為O(n) 

2. 直接將數字本身反轉,然後將反轉後的數字與原始數字進行比較,如果它們是相同的,那麼這個數字就是迴文。這個演算法的關鍵就是要得到每一位數字然後再相加,綜合利用除法(/)和取模(%)可以解決。

程式碼實現(method 2):

var isPalindrome2 = function(x) {
    var  y = x;
    var xReversed = 0;
    while(x > 0){
        xReversed = x % 10 + xReversed * 10;
        x = Math.floor(x / 10);
    }
    return y == xReversed;
};

程式碼解析(method 2):

首先,我們建立一個 x 的副本(因為在之後的操作中,會更改 x 的值,故需先將 x 的原始值複製下來,以進行後期比較)。當 x 大於0時,執行迴圈(這樣也可以直接判斷出負值不是迴文數)。在迴圈體內,例如對於數字 121,如果執行 121 % 10,我們將得到最後一位數字 1,要得到倒數第二位數字,我們可以先通過除以 10 把最後一位數字從 121 中移除,Math.floor(121 / 10) = 12,再求出上一步結果除以10的餘數,12 % 10 = 2,就可以得到倒數第二位數字。如果我們把最後一位數字乘以10,再加上倒數第二位數字,1 * 10 + 2 = 12,就得到了我們想要的反轉後的數字。 如果繼續這個過程,我們將得到更多位數的反轉數字。

該演算法的時間複雜度為O(lg(n))

該演算法的空間複雜度為:O(1)