描述

在不使用额外的内存空间的条件下判断一个整数是否是回文。
回文指逆序和正序完全相同。
数据范围:231n2311
进阶: 空间复杂度 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;
    }
};