审题
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
看到这道题,一看,字符串加双指针实现直接就可以AC了,然而为了时间复杂度和空间复杂度,我们还是要搞一下数学方法试一试
- 在方案一中,字符串加双指针。
- 在方案二中,数学方法。
代码实现
方案一:
常规操作,没啥好说的。
class Solution {
public:
bool isPalindrome(int x) {
int l, r;
string s = to_string(x);
l=0;
r=s.length()-1;
while ( l<r ) {
if ( s[l] != s[r] ) return false;
l++; r--;
}
return true;
}
};
方案2:
在看了一眼官方题解后,发现这个方案一的解法不仅在时间复杂度上差了许多,并且,在空间复杂度上也没有得到足够的优化,因此,有了我们的如下解法。
- 首先,判断该数是否是负数或以0结尾,(这步如果不排除以0为结尾的数用不了我们的while中的计算,因为while中的计算是数字模拟字符串的比较,而如果有0出现,则无法完全模拟,例如:1210不是回文,而121是回文,这将会使两个数字都变为回文,显然,这不是正确的。)
- 在while循环中,我们不断削减数字的长度,利用前半段整数和后半段整数相比较。需要注意的是,这里对于偶数位数的整数没有问题,对于奇数位数的整数则要比较整除10之后的情况。
class Solution {
public:
bool isPalindrome(int x) {
if ( x<0 || ( x%10==0 && x!=0 ) ) return false;
int ret=0;
while ( x>ret ) {
ret = ret*10 + x%10;
x /= 10;
}
return ((x==ret) || (x==ret/10));
}
};
反思
本来想用来放松的一道简单题,然而发现利用好分类讨论可以解决好多问题,这还只是数学的初级应用,爱了爱了。