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)