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
进阶:你能不将整数转为字符串来解决这个问题吗?
解法
方法一:反转一半数字
我们先判断特殊情况:
- 如果 \(x \lt 0\),那么 \(x\) 不是回文数,直接返回
false
; - 如果 \(x \gt 0\) 且 \(x\) 的个位数是 \(0\),那么 \(x\) 不是回文数,直接返回
false
; - 如果 \(x\) 的个位数不是 \(0\),那么 \(x\) 可能是回文数,继续执行下面的步骤。
我们将 \(x\) 的后半部分反转,与前半部分进行比较,如果相等,那么 \(x\) 是回文数,否则 \(x\) 不是回文数。
举个例子,例如 \(x = 1221\),我们可以将数字后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相等,我们得知数字 \(x\) 是回文。
让我们看看如何将后半部分反转。
对于数字 \(1221\),如果执行 \(1221 \bmod 10\),我们将得到最后一位数字 \(1\),要得到倒数第二位数字,我们可以先通过除以 \(10\) 将最后一位数字从 \(1221\) 中移除,\(1221 / 10 = 122\),再求出上一步结果除以 \(10\) 的余数,\(122 \bmod 10 = 2\),就可以得到倒数第二位数字。
如果继续这个过程,我们将得到更多位数的反转数字。
通过将最后一位数字不断地累乘到取出数字的变量 \(y\) 上,我们可以得到以相反顺序的数字。
在代码实现上,我们可以反复“取出” \(x\) 的最后一位数字,并将其“添加”到 \(y\) 的后面,循环直到 \(y \ge x\),如果此时 \(x = y\),或者 \(x = y / 10\),那么 \(x\) 就是回文数。
时间复杂度 \(O(\log_{10}(n))\),其中 \(n\) 是 \(x\)。对于每次迭代,我们会将输入除以 \(10\),因此时间复杂度为 \(O(\log_{10}(n))\)。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|