描述
在不使用额外的内存空间的条件下判断一个整数是否是回文。
回文指逆序和正序完全相同。
数据范围:−231≤n≤231−1
进阶: 空间复杂度 O(1),时间复杂度 O(len(n))
问题分析:根据回文数字的特性,末尾跟首位的数字一定相同。那么如果我们能够获得
末尾和首位,然后把末尾和首位去掉,这样每次都是只比末尾和首位。
如何获得末尾很简单只需要x%10,那么首位应该如何获取,我们知道一个数的首位等于
x/(10m),m根据数字大小而定,所以我们就可以设计一个函数size_x来获得x的长度k。
接着定义一个i,让i=10k-1,这样x/i就是x的首位。接下来就简单了。比较两个数字就行了。
具体过程看代码,有详细注释
复杂度分析:
时间复杂度O(len(x)):获取x长度O(len(x)),计算i为O(len(x)-1),回文判断为O(len(x)/2)。
空间复杂度O(1):只定义了2个变量。
class Solution { public: int size_x(int x) {//获取数字长短 int n=1; while(x>=10) x/=10,++n; return n; } bool isPalindrome(int x) { if(x<0) return false; if(x<10) return true; int k=size_x(x);//数字的长度 int i=1;//用于获取x第一位数字 while(k>1) i*=10,--k; while(x!=0) { if(x%10!=x/i) return false;//x/i为x的首位,x%10为x的末位 x%=i;//把当前第一位去掉 x/=10;//把当前末尾去掉 i/=100;//由于去掉了首位和末尾,i相应的要除100 } return true; } };