9. 回文数
点击上方,跳转至Leetcode
题目描述
给你一个整数 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
进阶:你能不将整数转为字符串来解决这个问题吗?
解法
首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。除了 0 以外,所有个位是 0 的数字不可能是回文,因为最高位不等于 0。所以我们可以对所有大于 0 且个位是 0 的数字返回 false。
现在,让我们来考虑如何反转后半部分的数字。
对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。
复杂度分析:
时间复杂度:\(O(\log \textit{n})\),对于每次迭代,我们会将输入除以 10,因此时间复杂度为 \(O(\log \textit{n})\)。
空间复杂度:\(O(1)\)。我们只需要常数空间存放若干变量。
Python3
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
y, t = 0, x
while t:
y = y * 10 + t % 10
t //= 10
return x == y
C++
class Solution {
public:
bool isPalindrome(int x) {
if(x<0)
return false;
int t = x;
long long y = 0;
while(t){
y = y * 10 + t % 10;
t = t / 10;
}
return x==y;
}
};
标签:10,false,数字,复杂度,0009,121,Leetcode,回文
From: https://www.cnblogs.com/yege/p/17496272.html