題目
給你一個整數
x
,如果x
是一個迴文整數,返回true
;否則,返回false
。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。* 例如,
121
是迴文,而123
不是。示例 1:
輸入:x = 121
輸出:true示例 2:
輸入:x = -121
輸出:false
解釋:從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。示例 3:
輸入:x = 10
輸出:false
解釋:從右向左讀, 為 01 。因此它不是一個迴文數。提示:
-
-2^31 <= x <= 2^31 - 1
問題分析
- 121 是迴文,因為從前往後和從後往前都一樣。
- -121 不是迴文,因為負號不能出現在末尾。
- 10 也不是迴文,因為從前往後是 "10",但從後往前是 "01"。
思路
透過反轉一半的數字來判斷是否迴文。
1、排除特殊情況: 一開始排除一些特殊數字,比如負數肯定不是迴文,另外如果一個不是0的整數的個位是0,它也不是迴文(因為開頭肯定不是0)。
2、逐步反轉: 從原始整數的最後一位(x%10
)開始提取,放到新的整數reversedHalf
的末尾(reversedHalf*10 + x%10
),然後把這個數字從原整數中剔除(x /= 10
)
3、停止條件: 當原始整數剩餘部分小於新的整數,說明已經反轉了一半數字了
4、判斷迴文: 如果是偶數個數,則兩個數相等;如果是奇數個數,則 x 就等於 reversedHalf/10
,忽略中間的數字。
複雜度
- 時間複雜度: O(log n)
- 空間複雜度: O(1)
程式碼實現
func isPalindrome(x int) bool {
if x < 0 || (x%10 == 0 && x != 0) {
return false
}
reversedHalf := 0
for x > reversedHalf {
reversedHalf = reversedHalf*10 + x%10
x /= 10
}
return x == reversedHalf || x == reversedHalf/10
}