力扣-9-回文数
抛开空间复杂度O(N)的解法(转字符串),要想O(1),还是反转的思想
确切地说,是造一个长度为原数字位数一半、各位数与原数字反转的数
例如:原数字1234,要构造的就是43
原数字123,要构造的就是32
- 怎么取各位数字呢?答案是“%”与“/”操作的组合
这里要注意的一点是,因为两个运算操作都是对10操作,那么10的倍数必须特殊处理
比如:原数字1000,在代码条件中会一直循环(因为反转后的数字始终为0)直到等于1,结果是11,返回true
这里还要特别额外处理“0”的情况==
- 怎么判断到没到一半?答案是原数字剩下的部分小于反转数字的时候
对于单数长度,反转数字一定会多一位时
对于双数长度可能多一位,也可能同位
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0|| (x!=0&&x % 10 == 0)) return false;
// 这个情况被下面包含了
// if (x < 10) return true;
int reverse = 0;
// 这个条件是判断反转到一半了
while (x > reverse) {
reverse = reverse * 10 + x % 10;
x /= 10;
}
// 后一个条件是为了处理数字位数是单数的情况
// 考虑前两位大于后两位的反转的情况…
if (x == reverse||x==reverse/10) return true;
else return false;
}
};
想一想3412这个例子,反转后分别为:3和214
…感觉越想越复杂了