LeetCode 9.回文數
題目
給你一個整數 x ,如果 x 是一個回文整數,返回 true ;否則,返回 false 。
回文數
是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
例如,121 是回文,而 123 不是。
示例 1:
輸入:x = 121
輸出:true
示例 2:
輸入:x = -121
輸出:false
解釋:從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個回文數。
示例 3:
輸入:x = 10
輸出:false
解釋:從右向左讀, 為 01 。因此它不是一個回文數。
提示:
-231 <= x <= 231 - 1
筆者解法
不考慮邊界條件的話,其實算法很簡單。不過這題的核心就是考慮溢出的情況,例如123XXX329這個數字翻轉后進行比較得到923XXX321,可能會大于INT_MAX,所以算法需要做一些小小的變動。
例如數字為5812XX2189(XX表示有N位不確定的數字),防止反轉后溢出,可以由低位到次高位進行翻轉,即翻轉后得到數字為9812XX328(最高位5不做處理),然后再將9812XX328與原數字5812XX2189除以10進行比較,如果相同則符合。
class Solution {
public:
bool isPalindrome(int x) {
if( x < 0) return false;
int tmp = x;
int reverseVal = 0;
int rem = 0;//余數
while(tmp > 9){
rem = tmp % 10;
tmp = tmp / 10;
reverseVal = reverseVal * 10 + rem;
}
return reverseVal == x / 10;
}
};
官方解法
邏輯上跟我思路一樣的,不過官方更簡潔一些。官方解法只需要循環一半,直接比較。例如123443216,新的數字得到61234后,就將新數字跟原數字的前一半進行比較。不過要注意長度為奇偶數的情況。還需要注意1000這種,末尾數字為0的特殊情況。
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;
if(x == 0) return true;
//這里主要考慮10000這種,末尾是0的數字。這里是重點,容易漏掉。
if(x % 10 == 0) return false;
int reverseVal = 0;//翻轉后的數字
while(x > reverseVal){
reverseVal = reverseVal * 10 + x % 10;
x = x / 10;
}
//判斷長度為偶數、長度為奇數
return reverseVal == x || reverseVal / 10 == x;
}
};

浙公網安備 33010602011771號